assembly 用汇编语言求N个数中的最大值

f3temu5u  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(129)

嗨,我是一个汇编语言的初学者。我试图找到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
acruukt9

acruukt91#

程序确实从用户定义列表中找到了最大数字,但每次显示结果时都会添加256。

代码设法找到一个最大的数字,但它是否是**最大的数字取决于在你的数字数组后面有什么垃圾!你的 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大于或等于零,就继续循环,所以会得到接下来的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寄存器。
您的转换例程 * h2 a * 使用字长除法div bx,它将DX:AX除以BX。您已将其设置为AL并清除了DX,,但AH仍包含最近调用的DOS.GetCharacter函数中的值01 h,该函数是 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

相关问题