编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数:字),要求:(1)输入参数通过堆栈传送,输出参数通过AX传送(假设结果可以用AX表示得下);(2)结果需要按照10进制的格式

分析:

        由题意,编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数:字),由于是有符号数,故使用乘法运算时要注意使用imul命令,由于是字,故使用十六位寄存器运算,内存寻址时使用word ptr,要求中已说明结果大小不超过ax的氛围,故用ax作为出口参数,堆栈传送入口参数。使用系统指令在屏幕上输出字符串,把ax中存储的十六进制数转化为十进制输出,需要计算出十进制数每一位,转换为ASCII码后合并为一个字符串后输出。为了避免主程序过于复杂,故在calcu子程序中实现十六进制到十进制的转换。

       在数据段,定义x和y的初始值,并为运算结果z留下存储空间,用数组array存储10000,1000,100,10,1的十六进制数2710h,03e8h,0064h,000ah,0001h,作为除数计算出十进制数结果的每一位数字,并定义字符串dec_num存储十进制输出字符串结果。

       在代码段,把计算变量入栈,利用bp存储临时sp,实现相对寻址栈内使用计算数据,并保护用到的寄存器值,将结果存在z,在主程序放在ax寄存器中。由于al中存放的十进制数字节add 30h是对应的ASCII,循环五次把结果放入dec_num,依次判断数字是否为零,直到第一个不为零开头的数记录此时的地址送入dx,在屏幕上输处十进制结果。

主程序如下:


子程序如下:


复杂的计算一定注意有符号还是无符号! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值