Arithmetic Instructions

INC Instruction

Lệ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

Lệ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

Bạn có thắc mắc rằng liệu nếu ta thực hiện trừ mà kết quả ra 1 số âm thì nó sẽ hiển thị như nào nhỉ ?

Hoặc nếu mà cộng ra số quá to thì sao? ==> phần này mình sẽ để cho các bạn tự tìm hiểu nhé.

MUL/IMUL instruction

Có hai instruction để nhân. Lệnh MUL(Multiply) xử lý dữ liệu unsignedIMUL (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 MULvớ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:

DX là sai, EAX sẽ thay thế cho DX

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 DIVIDIV đề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:

DX AX = thanh ghi EAX.

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