除法指令
-
DVI無符號數除法指令
-
指令格式:DIV 源
-
指令功能:對兩個無符號二進制數進行除法操作。源操作數可以是字或字節。
-
如果源操作數為字節,16位被除數必須放在AX中,8位除數為源操作數,它可以是寄存器或存儲單元。相除之后,8位商在AL中,余數在AH中。即
AL ← AX/源(字節)的商
AH ← AX/源(字節)的余數
-
要是被除數只有8位,必須把它放在AL中,并將AH清0,然后相除。
-
如果源操作數為字,32位被除數在DX、AX中,其中,DX為高位字,16位除數作源操作數,它可以是寄存器或存儲單元。相除之后,AX中存16位商,DX中存16位余數。即
AX ← (DX, AX)/源(字)的商
DX ← (DX,AX)/源(字)的余數
-
要是被除數只有16位,除數也是16位,則必須將16位被除數送到AX中,再將DX寄存器清0,然后相除。
-
與被除數和除數一樣,商和余數也都為無符號數。DIV指令執行后,所有標志均無定義。
; 以下程序實現 1001 ÷ 100 的結果
assume cs:code, ds:data, ss:stackdata segmentdb 256 dup(0)
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov ax, 1001mov bl, 100div blmov ax, 4C00Hint 21
code endsend start
代碼執行結果:
; 以下程序實現 100001 ÷ 100 的結果
assume cs:code, ds:data, ss:stackdata segmentdd 100001dw 1db 1
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov ax, datamov ds, axmov ax, ds:[0]mov dx, ds:[2]mov bx, 100div bxmov ax, 4C00Hint 21
code endsend start
代碼執行結果:
; 以下程序使用 word ptr 實現 1232131 ÷ 100 的結果
assume cs:code, ds:data, ss:stackdata segment
dd 1232131
; dd 占用4個字節dw 100
; dw 占用 2個字節db 1
; db 占用一個字節
data endsstack segment stackdb 128 dup
(0
)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov ax, datamov ds, axmov ax, ds:
[0
]mov dx, ds:
[2
]div word ptr ds:
[4
]mov ax, 4C00Hint 21
code endsend start
總結:
除數:8bit或16bit 存在內存單元中或者寄存器中
被除數:存放在AX或者 AX和DX中
如果除數為8bit,被除數則為16bit,存放在AX中
如果除數為16bit,被除數則為32bit,AX存放低16bit,DX存放高16bit
結果:如果除數為8bit,則AL 存商,AH存放余數
如果除數為16bit,則AX存放商,DX存放余數
乘法指令
MUL 無符號數乘法指令
- 指令格式:NUL 源
- 指令功能:把源操作數和累加器中的數都當成無符號數,然后將兩數相乘,源操作數可以是字節或字。
- 如果源操作數是一個字節,它與累加器AL中的內容相乘,乘積為雙倍長的16位數,高8位送到AH,低8位送到AL。即
- 如果源操作數是一個字,則它與累加器AX的內容相乘,結果為32位數,高位字放在DX寄存器中,低位字放在AX寄存器中。即
- 乘法指令中,源操作數可以是寄存器,也可以是存儲單元,但不能是立即數。當源操作數是存儲單元時,必須在操作數前加BYTE 或 WORD 說明是字節還是字。
; 以下程序實現 200 * 29 的結果
assume cs:code, ds:data, ss:stackdata segmentdb 256 dup(0)
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov al, 200mov bl, 29mul blmov ax, 4C00Hint 21Hcode endsend start
; 以下程序實現 200 * 50 的結果
assume cs:code, ds:data, ss:stackdata segmentdb 50
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov bx, datamov ds, bxmov al, 200mul byte ptr ds:[0]mov ax, 4C00Hint 21Hcode endsend start
; 以下程序實現 200 * 12345 的結果
assume cs:code, ds:data, ss:stackdata segmentdb 256 dup(0)
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov bx, datamov ds, bxmov ax, 200mov bx, 12345mul bxmov ax, 4C00Hint 21Hcode endsend start
; 以下程序實現 54321 * 200 的結果
assume cs:code, ds:data, ss:stackdata segmentdw 54321
data endsstack segment stackdb 128 dup(0)
stack endscode segmentstart: mov ax, stackmov ss, axmov sp, 128mov bx, datamov ds, bxmov ax, 200mul word ptr ds:[0]mov ax, 4C00Hint 21Hcode ends
end start
總結
以上是生活随笔為你收集整理的汇编语言 乘法和除法指令的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。