使用汇编语言查找 N 个数字中最大的

问题描述 投票:0回答:1

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

loops sorting assembly x86-16 emu8086
1个回答
0
投票

程序确实从用户定义的列表中找到最大的数字,但每次显示的结果都添加了 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
© www.soinside.com 2019 - 2024. All rights reserved.