Phần 2: Các phép toán trong assembly

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.



Đăng nhận xét

0 Nhận xét