x86汇编学习 ----- 七
div指令
div指令是除法指令,对于除法运算,我们可以想到的有关数据就是:被除数、除数、商以及余数。那么这几个数据在进行除法运算是是储存在什么地方的?运用该指令应该注意以下几个问题
(1)、除数有8位和16位之分。储存在寄存器(非段寄存器)和内存中。
(2)、被除数:其默认存放在AX或DX和AX中。如果除数为8位那么其储存在AX中,如果除数是16位那么被除数有32位储存在DX和AX中,DX存放高16位,AX存放低16位
(3)、结果:如果除数是8位,那么AL存放商AH存放余数;如果除数为16位,那么AX存放商,DX存放余数。
该指令调用格式
div reg
div 内存单元
比如
div byte ptr ds:[idata]
其含义:(al)=(ax)/((ds)*16+idata)的商
(ah)=(ax)/((ds)*16+idata)的余数
其中(寄存器)表示寄存器中的值,(内存单元)表示内存单元中的值
又如
div word ptr es:[idata]
其含义:(ax)=((dx)*10000h+(ax))/((es)*10h+idata)的商
(dx)=((dx)*10000h+(ax))/((es)*10h+idata)的余数
下面利用div指令计算100001/100
分析:16位能储存的值最大为2的16次方-1=65535<100001,所以被除数要用两个16位寄存器储存DX和AX。十进制100001与十六进制186a1相等,所以(ax)=86a1h (dx)=0001h
除数为100可以用8位储存,一个内存单元。
以下为程序代码:
;计算100001/100 ====== 186a1h/64h
;其商为1000( 03e8h )余数( 0001h )
;YoungWei 2011-10-9
assume cs:code,ds:data
data segment
db 100 ;数据段存储除数
data ends
code segment
start: mov ax,data
mov ds,ax ;将定义的数据段和ds相关联
;设置被除数
mov dx,0001h
mov ax,86a1h
div word ptr ds:[0] ;利用div进行运算
mov ax,4c00h
int 21h
code ends
end start
一开始查看寄存器中的值
E:\SourceCode\Assemble\Masm615>debug testdiv1.exe
-r
AX=0000 BX=0000 CX=0024 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=145F ES=145F SS=146F CS=1470 IP=0000 NV UP EI PL NZ NA PO NC
1470:0000 B86F14 MOV AX,146F
可知
(ax)=0000h (dx)=0000h其他寄存器的值与本程序目的关系不大
从第一条语句 mov AX,146F 可知data段地址为146F那么查看该内存中是否存放了100=64h
-d 146f:0
146F:0000 64 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 d...............
146F:0010 B8 6F 14 8E D8 BA 01 00-B8 A1 86 F6 36 00 00 B8 .o..........6...
其中第一个内存单元的数据就是64h
继续执行
AX=146F BX=0000 CX=0024 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=146F ES=145F SS=146F CS=1470 IP=0005 NV UP EI PL NZ NA PO NC
1470:0005 BA0100 MOV DX,0001
-t
www.zzzyk.com
AX=146F BX=0000 CX=0024 DX=0001 SP=0000 BP=0000 SI=0000 DI=0000
DS=146F ES=145F SS=146F CS=1470 IP=0008 NV UP EI PL NZ NA PO NC
1470:0008 B8A186 MOV AX,86A1
-t
AX=86A1 BX=0000 CX=0024 DX=0001 SP=0000 BP=0000 SI=0000 DI=0000
DS=146F ES=145F SS=146F CS=1470 IP=000B NV UP EI PL NZ NA PO NC
1470:000B F6360000 DIV BYTE PTR [0000] DS:0000=64
到此为止被除数已设置完毕
下面就是指令div的重点
-t
AX=03E8 BX=0000 CX=0024 DX=0001 SP=0000 BP=0000 SI=0000 DI=0000
DS=146F ES=145F SS=146F CS=1470 IP=000F NV UP EI PL NZ NA PO NC
1470:000F B8004C MOV AX,4C00
其中(ax)=03E8h=1000 (dx)=0001h=1达到程序目的
注意:本人在写该程序出现过错误我用的指令时
div byte ptr [0]
此语句汇编就不会通过,应该是语法错误,那么div后必须跟 段地址:[idata]然后改成
div byte ptr ds:[0]
改为该语句后汇编能通过,但是运行到此语句时出现divied overflow的错误 ,那么也就可以说明div运算的数据长度取决于被除数而非除数。
作者 Vi_Young
补充:软件开发 , 其他 ,