You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:24:25