嗨,我是一个汇编语言的初学者。我试图找到N个用户定义的数字中最大的一个。程序确实找到了用户定义列表中最大的数字,但每次都显示结果加上256。
code segment
assume cs:code, ds:data
start:
mov ax,data
mov ds,ax
printstring msg1 ;how many numbers
readnum num
mov si,offset ntable
mov ch,00
mov cl,num
read: ;function to get input numbers
printstring msg2
readnum temp
mov al,temp
mov [si],al
inc si
loop read
mov si,offset ntable ;load offset of ntable in source index
mov al, [si]
mov ch,00
mov cl,num
check:
cmp al,[si+1]
jnl next
mov al,[si+1]
next:
inc si
dec cl
cmp cl,00
jge check
exit:
mov si,offset result
mov [si],al
1条答案
按热度按时间acruukt91#
程序确实从用户定义列表中找到了最大数字,但每次显示结果时都会添加256。
代码设法找到一个最大的数字,但它是否是**最大的数字取决于在你的数字数组后面有什么垃圾!你的 check 循环做了太多的2次迭代。
考虑两个数字的输入:例如15和38,其中一个比较就足以建立最大值。num 变量将保存2,所以这就是你在CL中加载的内容。
因为只要CL大于或等于零,就继续循环,所以会得到接下来的3次迭代:
程序确实从用户定义的列表中找到了最大数字,但每次显示结果时都会添加256。
+256来自于在处理数字到文本的转换之前没有复位AH寄存器。
您的转换例程 * h2 a * 使用字长除法
div bx
,它将DX:AX除以BX。您已将其设置为AL并清除了DX,,但AH仍包含最近调用的DOS.GetCharacter函数中的值01 h,该函数是 readnum 宏的一部分。改进的代码: