➕Arithmetic Instructions
INC
Instruction
INC
InstructionLệnh INC (increase) được sử dụng để tăng một toán hạng lên một. Nó hoạt động trên một toán hạng duy nhất có thể nằm trong thanh ghi hoặc trong bộ nhớ. Ví dụ:
inc ebx ; thanh ghi 32-bit
inc dl ; thanh ghi 8-bit
inc dx ; thanh ghi 16-bit
inc [count] ; biến
Cú pháp của nó là:
inc destination
DEC
Instruction
DEC
InstructionLệnh DEC
(decrease) được sử dụng để giảm một toán hạng xuống một. Nó hoạt động trên một toán hạng duy nhất có thể nằm trong thanh ghi hoặc trong bộ nhớ. Cú pháp tương tự với INC
instruction
ADD, SUB instruction
Khác với 2 instruction trên, đối với 2 instruction này nó có thể cộng và trừ 2 toán hạng với nhau.
Cú pháp:
add destination source
sub destination source
Kết quả của toán hạng sẽ được lưu vào destination.
Ví dụ:
operand1 equ 0xa
operand2 equ 0x5
add operand1 operand2 ---> operand1 = 0xa + 0x5 = 0xf
sub operand1 operand2 ---> operand1 = 0xf - 0x5 = 0xa
ADD/SUB instruction có thể thực hiện trên:
Register vs register
Memory vs register
Register vs memory
Register vs constant data
Memory vs constant data
MUL/IMUL instruction
Có hai instruction để nhân. Lệnh MUL
(Multiply) xử lý dữ liệu unsigned và IMUL
(Integer Multiply) xử lý dữ liệu signed (tưc là có dấu và không dấu). Cả hai instruction đều ảnh hưởng đến carry flag và overflow flag.
Nói qua về 2 cờ(flag) này thì: Nếu phép nhân của bạn vượt quá giới hạn dữ liệu cho phép cờ overflow sẽ có giá trị là 1 và cờ carry có giá trị là 1 khi và chỉ khi kết quả của bạn là 1 số sign.
Bạn có thể tìm hiểu nó thêm ở trên mạng.
Syntax:
MUL/IMUL operand
Tùy thuộc vào kích thước của phép nhân và hệ số nhân và kết quả được lưu trữ trong hai thanh ghi tùy thuộc vào kích thước của toán hạng. Phần sau đây giải thích instruction MUL
với ba trường hợp khác nhau:
Khi 2 toán tử 1 byte được nhân với nhau

Thì trong trường hợp này, processor sẽ sử dụng thêm thanh ghi AH để lưu kết quả vì bây giờ thanh ghi AL không thể lưu trữ được 2 bytes. Bản thân mỗi thanh ghi AH và AL chỉ có thể lưu trữ tối đa 8 bits. Nhìn ảnh sau:

bạn có thể tự tính để nhận ra điều đó :>>.
Khi 2 toán tử 1 word(2 bytes) được nhân với nhau:

Tương tự như trên thì bây giờ nó sẽ sử dụng cả thanh ghi EAX để lưu trữ kết quả sau khi tính toán (vì EAX có thể chứa tối đa 32 bits)
Khi 2 toán tử 1 doubleword(4 bytes) được nhân với nhau:

Trong trường hợp này, thay vì nó sẽ sử dụng phần nào đó còn lại của 1 thanh ghi thì nó sẽ sử dụng 1 thanh ghi khác, đó là EDX
để lưu trữ giá trị.
À quên mất là nó chỉ sử dụng 1 operand duy nhất đó là thanh ghi EAX.
ví dụ như mul dl
<==>
al = al * dl
Ví dụ:
MOV AL, 10
MOV DL, 25
MUL DL
...
MOV DL, 0x0FF ; DL= -1
MOV AL, 0x0BE ; AL = -66
IMUL DL
DIV/IDIV Instructions
Trong trường hợp chia, tràn có thể xảy ra. Bộ xử lý tạo ra ngắt nếu xảy ra tràn. Lệnh DIV
được sử dụng cho dữ liệu unsigned và IDIV (Chia số nguyên) được sử dụng cho dữ liệu signed.
Syntax
DIV/IDIV operand
Cả hai DIV
và IDIV
đều có thể hoạt động với toán hạng 8 bit, 16 bit hoặc 32 bit. Hoạt động này ảnh hưởng đến tất cả sáu cờ trạng thái. Phần sau đây giải thích ba trường hợp chia với kích thước toán hạng khác nhau.
Khi chia cho 1 số có kích thước 1 byte:

Kết quả sẽ được lưu trong thanh ghi AL và số dư sẽ được lưu trong thanh ghi AH. Trong assembly sẽ không có phép chia và thanh ghi có thể chứa được số thập phân.
Khi chia cho 1 số có kích thước 1 word:

thì tương tự với phần trên.
Khi chia cho 1 số có kích thước double word:

Còn đối với 64 bits thì nó sẽ tách ra 2 thanh ghi riêng biệt. Nhưng phần này hầu như các bạn không gặp đâu <Mình cũng không chắc>
KẾT
Thì đấy là những gì mà bạn sẽ học được trong ngày thứ 5 này, như thường lệ bài tập về nhà của bạn sẽ là:

Chú ý rằng ở bài này mình sẽ chỉ thực hiện trên các số có 1 chữ số và kết quả cũng phải là 1 chữ số. Bởi vì trong bảng mã ascii nó sẽ ko hiển thị các số có 2 chữ số.
[!] Cố gắng làm trước khi nhìn đáp án.
Good luck!!
Last updated