分析:
由题意,编写一个子程序计算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,在屏幕上输处十进制结果。
主程序如下:
子程序如下:
复杂的计算一定注意有符号还是无符号!