参考图书:《微机原理与接口技术(第三版)》洪永强
原题在书的125页,4-12
仅提供个人思路,可能解决方案不是很好,欢迎交流。
题目
12.编写程序,不用乘法计算Z=10×X+Y/8,用移位运算。
分析
①首先这是一个简单的计算题,有加法、乘法、除法运算。题目要求不能使用乘法,使用移位代替乘法。所以只能使用加法、除法、移位。
②将乘法转换为移位。
计算机内存储的是二进制数据,左移一位等同于做一次X2的运算。右移一位等同于做一次÷2的运算。
但并不是完全等同,还要取决于所用的指令,涉及到溢出,循环移位等。
③假如10xX,有两种方法计算,一种是把X拆分成2的n1次方+2的n2次方+…还有一种方法是把10拆分成2的3次方+2的1次方。考虑的既有题目解题尽可能的简单,这里选择后一种方法。
④Y/8可以用除法,但是这里使用右移3位(2^3=8)速度更快。
⑤最后加法运算,得出结论。
流程图
需要用到的指令
加法指令:
1) 不带进位加法指令ADD(add)
格式:ADD DEST, SRC
功能:DEST←SRC+DEST
2) 带进位加法指令ADC(add with carry)
格式:ADC DEST, SRC
功能:DEST←SRC+DEST+CF
ADC主要用于多字节加法运算中。
移位指令:
逻辑左移:SHL DEST,COUNT
逻辑右移:SHR DEST,COUNT
其中, DEST可用立即数以外的任何寻址方式; COUNT表示移位数, 其值或等于1, 或大于1,大于1时其值要先送到CL寄存器,再进行移位。
程序
;4-12 用移位不用乘法计算 Z=10*X+Y/8
DATA SEGMENT;数据段
X DW 90 ;假设是90
Y DW 80 ;假设80
Z DW 0 ;结果应该是910
DATA ENDS
STACKS SEGMENT;堆栈段
STACKS ENDS
CODE SEGMENT;代码段
ASSUME CS:CODE,DS:DATA,SS:STACKS
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACKS
MOV SS,AX ;初始化
MOV CL,3 ;移位数为3
MOV AX,X
SHL AX,1 ;X左移1位
MOV BX,X
SHL BX,CL ;X左移3位
ADD AX,BX ;X*2+X*8
MOV BX,Y
SHR BX,CL ;Y右移3位
ADD AX,BX ;X*10+Y/8
MOV Z,AX
CODE ENDS
END START
调试
从emu8086中调出变量框,开始运行程序。