x86汇编作业求助:用movzx/movsx实现指定表达式计算
汇编课程作业:实现表达式BX = -val1 + 20 – (val2 + val3)
作业要求
用汇编语言实现表达式BX = -val1 + 20 – (val2 + val3)。已知val1、val2、val3是8位整型变量,需将val1初始化为5,val2初始化为8,val3初始化为-4。要求必要时仅使用16位寄存器存储中间结果,按需使用movzx、movsx或neg指令,需用调试器验证结果。
我的代码实现
看起来你代码没写完,我先给个符合要求的完整实现(基于x86 MASM语法),你可以参考或者对照自己的代码调整:
.MODEL SMALL .STACK 100H .DATA val1 DB 5 ; 8位有符号变量,初始值5 val2 DB 8 ; 8位有符号变量,初始值8 val3 DB -4 ; 8位有符号变量,初始值-4(补码存储) .CODE MAIN PROC ; 初始化数据段寄存器 MOV AX, @DATA MOV DS, AX ; 第一步:计算 -val1 MOVSX AX, val1 ; 将8位val1符号扩展为16位到AX(AX=5) NEG AX ; 取反得到 -val1(AX=-5) ; 第二步:加上20 ADD AX, 20 ; AX = -5 + 20 = 15 ; 第三步:计算 val2 + val3 MOVSX BX, val2 ; BX=8(符号扩展为16位) MOVSX CX, val3 ; CX=-4(符号扩展为16位) ADD BX, CX ; BX = 8 + (-4) = 4 ; 第四步:用AX减去BX,结果存入BX SUB AX, BX ; AX =15 -4=11 MOV BX, AX ; BX最终值为11 ; DOS程序退出 MOV AH, 4CH INT 21H MAIN ENDP END MAIN
关键细节说明
- 用
MOVSX而不是MOVZX:因为val1/val2/val3是有符号8位变量,MOVSX会保留符号位扩展到16位,比如val3=-4,扩展后16位是FFFC,保证后续加法正确。如果用MOVZX会把负数当成无符号数处理,结果就错了。 NEG指令:专门用来对寄存器值取反,完美实现-val1的需求,比用SUB 0, AX更直观。- 所有中间计算都用16位寄存器(AX、BX、CX),完全符合作业要求。
调试验证方法
- 先把代码汇编、链接成可执行文件。
- 用调试工具(比如Debug.exe或者OllyDbg)加载程序:
- 单步执行到
MOV BX, AX这一行完成后,查看BX寄存器的内容。 - 按照计算逻辑,最终BX的值应该是十进制11,对应十六进制
0BH,如果调试结果一致,就说明代码正确。
- 单步执行到
内容的提问来源于stack exchange,提问作者bigatData
相关产品推荐
相关产品推荐

