You are on page 1of 6

1. Toán tử trong asm.

- LSL, LSR, ASR, ROR.


- LSL: Lệnh dịch trái logic: Khi đem 1 số dịch trái logic (LSL) đi n bit thì cần chèn n bit
0 vào bên phải và bỏ n bit bên trái đi.
R1 = 0xABC10210 LSL #4
R1 = 1011 1100 0001 0000 0010 0001 0000 0000 -> R1 = 0xBC102100
- LSR: Lệnh dịch phải logic: Khi đem 1 số dịch phải logic (LSR) đi n bit cần chèn n bit 0
vào bên trái và bỏ n bit bên phải.
R1 = 0x121ABCD2 LSR #3 bit
Biểu diễn nhị phân của R1:
R1 = 0001 0010 0001 1010 1011 1100 1101 0010
Chèn 3 bit 0 vào bên trái của R1 và bỏ 3 bit bên phải đi
R1 = 0000 0010 0100 0011 0101 0111 1001 1010
R1 = 0x0243579A
- ASR: Lệnh dịch phải số học (ASR) . Cần quan tâm tới bit đầu tiên của số là 0 hay 1.
Nếu là 0 : Dịch giống như dịch phải logic.
Nếu là 1: chèn n bit 1 vào bên trái và bỏ n bit vào bên phải.
R2 = 0xABCD1234 ASR #4
R2 = 1010 1011 1100 1101 0001 0010 0011 0100
R2 =1111 1010 1011 1100 1101 0001 0010 0011
R2 = 0xFABCD123

R3 = 0x1234ABCD ASR # 3
R3 = 0001 0010 0011 0100 1010 1011 1100 1101
R3 =0000 0010 0100 0110 1001 0101 0111 1001 -> R3 = 0x02459579
- ROR: Lệnh quay phải mở rộng. Muốn quay phải mở rộng số Rx đi n bit. Thì bê n bit
bên tay trái sang bên phải để theo thứ tự của nó.
R2 = 0xABCD1234 ROR #4
R2 =0100 1010 1011 1100 1101 0001 0010 0011
R2 = 0x4ABCD123
+ 0: 0000 + 8: 1000
+ 1: 0001 + 9: 1001
+ 2: 0010 +A: 1010
+ 3: 0011 +B: 1011
+ 4: 0100 +C: 1100
+ 5: 0101 + D: 1101
+ 6: 0110 + E: 1110
+ 7: 0111 + F: 1111
CPSR (Cờ trạng thái) SPSR(Gg search)
2. Một số câu lệnh chuyên dùng cho asm
+ MOV: Di chuyển dữ liệu. VD: MOV R2,R1; coppy giá trị của R1 vào R2. R2 = R1.
MOV R2, #0; Gán giá trị R2 = 0.
+ CMP, CMN: So sánh. Thường dùng CMP:
VD: CMP R2,R3; So sánh R2 với R3.
CMP R1,#100; So sánh R1 với 100.
+ ADD: Lệnh công.
VD: ADD R1,R2,R3; R1 = R2 + R3;
ADD R1,R2; R1 = R1 + R2;
VD: R1 = 0xFABC1234
R2 = 0xABCD1235
R3 = 0xFFFFFFFF
R1= 0xA68A2469 Cờ C được bật lên 1 báo hiệu tràn 1 bit
Tràn 1 ra ngoài ( C.N,Z,V) C = tràn 1 bit.
26 – 16 = 10 < 16 (Dừng trừ).
24 – 16 = 8
R2 = 0xABCD5461
VD: R1 = -0xABCD1234
0x0000422D
ADD R1,R2; R1 = -R1 + R2 => R1 = R2 – R1;
3. Bài tập về cờ N,Z,C,V
Flag N: Là cờ báo số âm. Khi bộ tính toán ALU thực thi (ADD, SUB, Dịch, …) có kq là số
âm thì N = 1. Còn nếu = 0 hoặc là số dương. N = 0.
Flag Z: Là cờ Zero. Khi bộ tính toán ALU thực thi có kq = 0 Z = 1. Còn lại các trường hợp
khác Z = 0.
Flag C: Là cờ báo tràn 1 bit(trong phép công) hoặc vay ( Mượn ) Trong phép trừ 1.
Flag V: Là cờ báo tràn > 1 (bắt đầu từ 2 bit) hoặc mượn > 1bit /
VD1: Cho chương trình:
MOV R1,#0x45ABCD11
MOV R2,#0xABCD1111
R1= -0x99DEBC00 -> Cờ C = 1. N = 1.
R1 = R1 – R2;

SUB R1,R2;
ADD R2,#0xFFFA 1311
#0xABCD1111
R2= 0xBBC72422 Tôi bị tràn 1 bit C = 1
Tìm R1, và R2 sau khi chạy chương trình + NZCV?
R1 = -0x99DEBC00
R2 = 0xBBC72422
Và C = 1, N = 1, V, Z = 0.
VD2: MOV R1, #0xABCD1234
MOV R2, #0x1256CFDA
MOV R3, R2, LSR,#32
R3 = 0;-> Z = 1,
MOV R4, R1, ASR,#4.
R4 = 0xABCD1234
R4 = 1010 1011 1100 1101 0001 0010 0011 0100
R4 = 1111 1010 1011 1100 1101 0001 0010 0011
R4 = 0xFABCD123

ADD R3,R4;
R3 = R3 + R4 = R4;
Tìm cờ N,Z,C,V? R3,R4 Sau khi chạy xong CT?
N = 0, Z = 1, C V = 0.
R3 = R4 = 0xFABCD123.

R1 = M[R7] ; R7 = R7 + 4:
MLA R1,R2; -> R1 = R1*R2;
MLA R1,R2,R3; R1 = R2*R3;
MLA R1,R2,R3,R4; R1 = R4 + R2*R3;
MLA R4,R0,R1,R4; R4 = R4 + R0 *R1;
PT: Số chẵn thì kiểm tra ntn ????
4: 0100
5: 0101
R3= 0x0001(hex): 0000 0000 0000 0001(nhị phân)
Rx = 0xABCD(hex): 1010 1011 1100 1101
Nhân R3 với Rx ( Nhân nhị phân AND) KQ = 0 -> Số chẵn. = 1 lẻ
/*Sai như này sẽ không có điểm??????*/
MOV R0, #1000H; Địa chỉ bắt đầu của mảng.
MOV R6, #0x0001; Số 1 (Số đem nhân để kt chẵn lẻ)
MOV R1, #512; Số lượng phần tử.
MOV R2,#8000H; Địa chỉ lưu kq
MOV R3,#0; Sum (Lưu tổng)
LOOP
LDR R4, [R0], #2; R4 = M[R0] R0 = R0 + 4;
MOV R7,R4; R7 = R4;/*Rất dễ đạt điểm 10đ*/
AND R5,R7,R6; R5 = R4 & R6;
CMP R5,#0;
ADDEQ R3,R4; R3 = R3 + R4;
SUB R1,#1;
CMP R1,#0;
BNE LOOP
END.

Sam là 1banj thích sưu tầm số gọi là may mắn. Sam cho rằng số may mắn mà mình tìm
Là những số trong đó có các chữ số gồm 6 và 8.
4567869 %10 = 9
4567869/10 = 456786.
MOV R0,#1000H; ….
MOV R1,#128; Pt
MOV R2,#0;
MOV R5,#2000H
MOV R6,#2004H
LOOP
LDR R3,[R0],#4;
CMP R3, #0;
BLGT TinhTong;
SUB R1,#1;
CMP R1,#0;
BNE LOOP
END
TinhTong:
ADD R2,R3;
MOV PC,LR;
SAVE
STR R2,[R5];
STR 0, [R6];

You might also like