8086汇编64位求和程序(16位算术)结果异常问题排查
问题排查结果
你的程序计算逻辑完全正确,按照代码定义,两个64位数相加的结果确实应为2222 2222 2222 2222h,但你得到了错误输出,可能由以下原因导致:
代码输入失误
- 实际编写的代码中,
num1或num2的数值可能被误写(比如把1111h写成1000h),直接导致相加结果为2000h。请再次检查数据段的定义,确保每个字都是1111h。 - 若
print_hex函数中的rol ax,4被误写为shl ax,4,会丢失高4位数据,最终输出类似2000的错误结果。
- 实际编写的代码中,
输出结果误读
你提到的错误输出2000 20000 2000 2000h中,20000大概率是相邻字输出时无分隔导致的视觉误判(比如22222222被看成22220222或20002000)。建议在输出每个字后添加空格分隔,便于清晰观察。汇编器或运行环境问题
部分老旧汇编器可能对十六进制数解析异常,建议使用MASM/TASM等标准8086汇编器重新编译;DOSBox等模拟环境的内存冲突也可能导致数据被意外修改,可尝试重启环境后重新运行。
修正后的验证代码(添加空格分隔)
以下是添加了空格分隔的代码,可清晰输出结果:
.model small .stack 100h .data num1 dw 1111h, 1111h, 1111h, 1111h ; 第一个数 num2 dw 1111h, 1111h, 1111h, 1111h ; 第二个数 result dw 0, 0, 0, 0 ; 结果存储区 msg db 'Result: $' ; 输出提示信息 .code main: mov ax, @data mov ds, ax mov es, ax ; 加载第一个数的各字到寄存器 mov ax, num1 mov bx, num1+2 mov cx, num1+4 mov dx, num1+6 ; 带进位相加 add ax, num2 adc bx, num2+2 adc cx, num2+4 adc dx, num2+6 ; 存储结果 mov result, ax mov result+2, bx mov result+4, cx mov result+6, dx ; 输出提示信息 lea dx, msg mov ah, 09h int 21h ; 输出结果(带空格分隔) mov ax, result+6 call print_hex call print_space mov ax, result+4 call print_hex call print_space mov ax, result+2 call print_hex call print_space mov ax, result call print_hex ; 程序退出 mov ah, 4Ch int 21h print_hex: ; 十六进制输出AX内容 push ax push bx push cx push dx mov cx, 4 print_loop: rol ax, 4 mov dl, al and dl, 0Fh add dl, '0' cmp dl, '9' jle print_char add dl, 7 print_char: mov ah, 02h int 21h loop print_loop pop dx pop cx pop bx pop ax ret print_space: ; 输出空格分隔符 push dx mov dl, ' ' mov ah, 02h int 21h pop dx ret end main
内容的提问来源于stack exchange,提问作者Az4iz
相关产品推荐
相关产品推荐

