编写计算表达式(X-Y+25)/Z的值得程序,要求将其商和余数分别放在A、B单元中。(设X和Y是32位无符号数,A、B和Z是16位无符号数,不考虑溢出情况。)
P151
例4.8
汇编思路:首先在DATA段定义X、Y、Z、A、B单元,其中由于X、Y是32位无符号数,所以类型定义为DD,Z定义为DW类型,A、B用于存放最后结果的商和余数部分,均定义为DW类型。STACK段,开辟50DB大小的运算存储空间。CODE段,由于X的类型为DD,所以需要使用修改属性运算符PTR指定位于其后的存储器操作数的类型,先将X的低字内容存放到AX中,然后AX与Y相减,即AX存放(X-Y)的低字内容部分;然后,DX存放X的高字内容,由于X的类型为DD,即指向下一个字需要+2,且也要使用修改属性运算符PTR指定位于其后的存储器操作数的类型。然后让AX低字内容+25,完成(X-Y+25)的低字内容运算的最终结果,使用ADC AX,0;使用带进位的加法指令,因为AX在与25相加的时候有可能存在进位现象,需要使用ADC带进位的加法指令。最终,AX存放低字部分内容,DX存放高字部分内容。然后,开始除Z,DIV Z;由于是无符号数,所有除法运算使用无符号数除法指令DIV,即隐含被除数为DX(高字),AX(低字),除数为Z,最后商存放在AX中,余数存放在DX中,AX赋值给A,DX赋值给B。最后调用4CH号功能返回到DOS系统,程序结束。
代码如下:
DATA SEGMENT
X DD 334467ABH ;随机的数
Y DD 0DF342189H ;随机的数
Z DW 5476H ;随机的数
A DW ? ;用于存放最后结果的整数部分,即除完之后的商
B DW ? ;用于存放最后结果的小数部分,即除完之后的余数
DATA ENDS
STACK SEGMENT STACKDB 50 DUP(0) ;使用stack栈,开辟一段运算空间(大小为50DB)
STACK ENDS
CODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATAMOV DS,AXMOV AX,WORD PTR X ;由于X定义为DD类型即2个字,这里将X的低字内容赋值给AXSUB AX,WORD PTR Y ;AX与Y的低字内容相减,即X和Y的低字内容相减,最后存放在AX中MOV DX,WORD PTR X+2 ;X和Y均是DD类型,高字内容需要+2,即将X的高字内容赋值给DXSBB DX,WORD PTR Y+2 ;X和Y均是DD类型,此时的DX为X所对应高字内容,因为要考虑到低字内容运算时是否借位\进位,所有用SBB带借位的减法指令 即X的高字内容-Y的高字内容ADD AX,25 ;X-Y+25 让AX低字内容加,因为25相加应该从低位相加,而不是让DX高字内容加ADC DX,0 ;因为需要考虑到进位的问题,这里使用带进位的加法指令ADC,使得DX加上进位,DX最终存放的是(X-Y+25)高字内容DIV Z ;因为X和Y都是无符号数,所以,除法运算使用无符号数除法指令DIV运算,(DX高位与AX低位)/Z --- AX存放商,DX存放余数MOV A,AX ;AX存放的商保存到A中MOV B,DX ;DX存放的余数保存到B中MOV AH,4CH ;调用4CH号功能,返回DOS操作系统指令INT 21H ;终止当前程序的运行,并返回DOS系统
CODE ENDSEND START