当前位置:软件学习 > 其它软件 >>

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

补充:软件开发 , 其他 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,