NASM汇编程序DOS控制台数字输出异常问题求助
问题排查与修复
1. 较大值计算逻辑完全不符合需求
任务要求将较大值替换为两数乘积的两倍,但当前代码仅对原较大值执行了shl bx,1(即原数×2),完全没有计算两数的乘积。以初始值x=3、y=5为例:
- 正确结果:3×5×2=30
- 当前代码计算:5×2=10
需要修改为先算乘积再乘2的逻辑,示例:
; 以less_than分支为例,先保存初始值再计算 mov cx, [x] ; 存初始x=3 mov dx, [y] ; 存初始y=5 mov ax, cx mul dx ; ax = 3×5=15 shl ax, 1 ; ax=15×2=30 mov [y], ax ; 将结果存回y
2. 变量读取的字节/字不匹配
你定义x和y用的是dw(16位字类型),但输出时仅读取byte [x](低8位字节)。这种读取方式会丢失高位数据,导致后续处理错误,必须直接读取完整的16位数值。
3. 多位数输出逻辑错误
int 21h的02h功能只能输出单个ASCII字符,且add dl, '0'的方式仅适用于0-9的单个数字。当数值为两位数(如30)或更大时,这种方法会输出非数字的ASCII符号——比如80+'0'=0x50,对应字符'P';112+'0'=0x70,对应字符'p',这就是你看到输出"Pp"的直接原因。
要输出多位数,需要编写子程序将数字拆解为单个字符再逐个输出,比如通过循环取余的方式处理:
; 输出16位数字的子程序,ax传入要输出的数字 print_num: push bx cx dx mov cx, 0 mov bx, 10 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop print_char: pop dx add dl, '0' mov ah, 02h int 21h loop print_char pop dx cx bx ret
修复后的核心代码示例
less_than: ; 先保存初始的x和y值 mov cx, [x] mov dx, [y] ; 计算半和替换较小值x mov bx, cx add bx, dx shr bx, 1 mov [x], bx ; 计算乘积的两倍替换较大值y mov ax, cx mul dx shl ax, 1 mov [y], ax ; 输出x mov ax, [x] call print_num ; 输出空格分隔 mov ah, 02h mov dl, ' ' int 21h ; 输出y mov ax, [y] call print_num ; 退出程序 mov ah, 4Ch xor al, al int 21h
内容的提问来源于stack exchange,提问作者Mizless
相关产品推荐
相关产品推荐

