Làm quen với hợp ngữ
Phần 2: Các phép toán trong assembly
Dec (Decrement): Giảm xuống
operand = operand – 1 ; Giảm
xuống 1 đơn vị
Vd:
MOV AL, 255 ; AL = 0FFh (255 hoặc -1)
DEC AL ;AL = 0FEh (254 hoặc -2) (từ 255 xuống còn 254)
RET ;(viết tắt của return: trả về)
Như chúng ta thấy ở phần màu xanh nước biển đang ở FF 255 RES
Sau khi nó chạy thì 255(mã hexa là FF) được lưu trong thanh ghi AL
DEC AL: Cho AL giảm xuống 1 đơn vị ( từ 255 xuống 254).
Kết thúc sau lệnh ret thì được kết quả như sau:
Nhìn vào thanh ghi AL, ta thấy chữ FE
FE là mã hexa của 254
Mẹo: Nhìn vào kết quả các
thanh ghi nhé. Trong trường hợp này nên nhìn vào kết quả của thanh ghi AL
Inc (Increment): tăng lên (Ngược lại với dec)
Cứ hiểu ngược lại thôi, thay chữ
MOV AL, 253 ; (FD là mã hexa của
253)
INC, AL ; AL tăng lên 1 đơn vị
RET
Kết quả: AL = FE (mã hexa của 254)
Lưu ý: không được nhập vào 255. Vì 255 là cao nhất rồi, không tăng lên được nữa - chỉ có thể giảm xuống.
Cờ CF không thay đổi khi dùng INC
ADD: Phép cộng
Add
[Toán hạng đích],[Toán hạng nguồn]
operand1 = operand1 + operand2
Lấy [toán hạng
nguồn] cộng với [toán hạng đích]. Kết quả lưu trong [toán hạng đích].
Vd:
MOV AL, 4 ; AL = 4
ADD AL, 3 ; AL = 7
RET
;Lấy 2 thằng cộng lại với nhau. Kết quả nằm trong thanh ghi AL (kết quả: 07).
SUB: Phép trừ
SUB
[Toán hạng đích],[Toán hạng nguồn]
Thuật toán:
operand1 = operand1 - operand2
Lấy [toán hạng
nguồn] trừ với [toán hạng đích]. Kết quả lưu trong [toán hạng đích].
Vd:
MOV AL, 7
SUB AL, 2 ; AL = 5
RET
;Gán AL = 7, dùng SUB AL = 2 để trừ đi 2. Kết quả nằm trong thanh ghi AL (kết quả: 05).
MUL: Phép nhân (Không dấu)
MUL [Toán hạng nguồn]
Lệnh Mul (Multiply):
Thực hiện phép nhân trên số không dấu. AX=AL*nguồn 8bit.
Các thanh
ghi 8bit: AH, AL, BH, BL, CL, CL, DH, DL.
Các thanh
ghi 16bit là sự kết hợp của 2 thanh ghi 8bit => AX, BX,CX, DX.
Vd:
MOV AL, 200 ; AL = 0C8h(mã hexa của 200 0C8h)
MOV BL, 4
MUL BL ; AX = 0320h (mã hexa của 800 là 0320h)
RET
Kết quả AX = 0320h (800)
DIV: Phép chia (không dấu)
Lệnh Div (Divide):
AL=AX chia nguyên nguồn 8bit, AH=AX chia dư nguồn 8bit.
Nếu là nguồn
16bit: lấy DX AX chia cho nguồn 16bit, thương số chứa trong AX, số dư trong DX.
Vd:
MOV AX, 203 ; AX = 00CBh
MOV BL, 4
DIV BL ; AL = 50 (32h), AH = 3
RET
Kết quả lưu
trong thanh ghi AL. Thanh ghi AL = 32h (32h là mã hexa của số 50.)
AH = 03 (Phần
dư)
Tại sao phải dùng ax chia, bở vì ax là thanh ghi 16 bit lớn thanh
ghi bl (8bit). Nếu phép nhân ra kết quả ax thì phép chia làm ngược lại (lấy ax
chia).
Ngoài ra còn
có: phần tìm hiểu thêm
Có dấu thì
có thể biểu diễn số âm
IMUL : nhân
có dấu
IDIV: chia
có dấu.
Kết thúc
Copyright © 2021 Đoàn
Quang Huy.
All rights reserved.
0 Nhận xét