8085汇编程序手工推演寄存器B最终值问题求解
8085汇编程序手工演算求寄存器B最终值
问题说明
- 核心要求:不实际运行程序,完全通过纸笔手工演算得到给定代码执行后寄存器B的最终值
- 常规解题逻辑:将代码中的十六进制、二进制立即数统一转换为同一进制(推荐二进制做位运算、十进制做算术运算),按指令顺序逐行推导寄存器值变化即可
- 演算卡点:执行
ADD B指令时,因不确定寄存器B的初始值,无法继续推进后续运算
待分析汇编源码
MOV A,B ADI 111 ANI FAH XRI 11110000B ADD B MVI D,10 INR D MOV C,D ADD C ORI ADH SUI 11 MOV B,A HLT
卡点说明与演算规则
首先明确8085汇编的立即数约定:
- 后缀
H为十六进制数,后缀B为二进制数,无后缀为十进制数,所有算术/逻辑运算均为8位运算,超出8位的进位自动舍弃 - 程序在执行到
MOV B,A指令前,没有任何指令修改过寄存器B的值,因此ADD B操作中用到的B值就是程序启动时B的初始值。如果是教材类习题,没有特殊说明的前提下默认通用寄存器初始值为0。
逐行演算过程(默认B初始值为0)
MOV A,B:将B的值赋值给累加器A,A=0ADI 111:将立即数111(十进制,即0x6F)加到A,A=0+111=111(0x6F,二进制01101111)ANI FAH:将A与十六进制数0xFA(二进制11111010)做按位与运算,A=01101111 & 11111010 = 01101010(0x6A,十进制106)XRI 11110000B:将A与二进制数11110000(即0xF0)做按位异或运算,高四位取反、低四位保持不变,A=01101010 ^ 11110000 = 10011010(0x9A,十进制154)ADD B:将B的值加到A,B当前为初始值0,A=154+0=154(0x9A)MVI D,10:将立即数10(十进制,即0x0A)写入寄存器D,D=10INR D:将D的值加1,D=11MOV C,D:将D的值赋值给寄存器C,C=11ADD C:将C的值加到A,A=154+11=165(0xA5,二进制10100101)ORI ADH:将A与十六进制数0xAD(二进制10101101)做按位或运算,A=10100101 | 10101101 = 10101101(0xAD,十进制173)SUI 11:将A减去立即数11(十进制,即0x0B),A=173-11=162(0xA2)MOV B,A:将A的值赋值给B,B=162(即十六进制0xA2)HLT:程序停机
如果B的初始值不是0,只需要在第1步将A替换为B的初始值B0,第5步加法时加B0,按同样逻辑逐行计算即可得到对应结果。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

