嗨,我是汇编语言的初学者。我试图找到 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
程序确实从用户定义的列表中找到最大的数字,但每次显示的结果都添加了 256。
代码设法找到a最大数字,但是这是否是最大最大数字取决于数字数组后面有什么垃圾!您的 check 循环执行 2 次迭代太多了。
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
考虑输入两个数字:例如。 15 和 38,其中一次比较就足以确定最大值。 num 变量将保存 2,因此这就是您在 CL 中加载的内容。
因为只要 CL 大于或等于 0,您就继续循环,因此您将得到接下来的 3 次迭代:
ntable
v
AL=15 CL=2 15 38 ?? ?? ?? ?? ?? ...
=====
^
SI
AL=38 CL=1 15 38 ?? ?? ?? ?? ?? ...
=====
^
SI
AL=.. CL=0 15 38 ?? ?? ?? ?? ?? ...
=====
^
SI
AL=.. CL=-1 15 38 ?? ?? ?? ?? ?? ...
^
SI
程序确实从用户定义的列表中找到最大的数字,但每次显示结果时都会添加 256 。
+256 来自于在处理从数字到文本的转换之前没有重置 AH 寄存器。
您的转换例程 h2a 使用字大小的除法
div bx
,它将 DX:AX 除以 BX。您已提供 AL 并且已清除 DX,但 AH 仍包含最近调用 DOS.GetCharacter 函数的值 01h,该函数是 readnum 宏的一部分。
改进后的代码:
mov si, offset ntable
mov al, [si]
mov cl, num ; 1 or more
jmp begin <<< part 1 of this answer
check:
cmp al, [si+1]
jnl next
mov al, [si+1]
next:
inc si
begin: <<< part 1 of this answer
dec cl <<< part 1 of this answer
jnz check <<< part 1 of this answer
done:
mov ah, 0 <<< part 2 of this answer