编写计算表达式(X-Y+25)/Z的值得程序,要求将其商和余数分别放在A、B单元中。(设X和Y是32位无符号数,A、B和Z是16位无符号数,不考虑溢出情况。)

编写计算表达式(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 STACK
	DB	50	DUP(0)	;使用stack栈,开辟一段运算空间(大小为50DB)
STACK	ENDS
CODE	SEGMENT
	ASSUME CS:CODE,DS:DATA,SS:STACK
START:	MOV	AX,DATA
	MOV	DS,AX
	MOV	AX,WORD PTR X	;由于X定义为DD类型即2个字,这里将X的低字内容赋值给AX
	SUB	AX,WORD	PTR	Y	;AX与Y的低字内容相减,即X和Y的低字内容相减,最后存放在AX中
	MOV	DX,WORD	PTR	X+2	;X和Y均是DD类型,高字内容需要+2,即将X的高字内容赋值给DX
	SBB	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	ENDS
	END	START
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

beyond谚语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值