为什么我的查找最大数的汇编代码不起作用?

Why is my assembly code to find the largest number not working?

我是汇编编程的新手,老实说,这是我用计算机编写的第一个代码(用于汇编)。

最大的数字显然是“9”,但它显示了一些字符(在键盘中不可用)。为什么这样?谢谢。

    .model small
.stack 64
.data
   array db 2,5,6,3,9,8
   count db 7
 large db ?
.code
   main proc far
   start:
      mov ax,@data
      mov ds,ax
      lea si, array
      mov dl,[si]
      mov large, dl
      inc si
      dec count
   l1:
      mov al,[si]
      cmp al,large
      jg largefound
   nochange:
      inc si
      dec count
      cmp count,00h
      jnz l1

   largefound:
      mov large,al
      inc si
      dec count
      cmp count,00h
      jnz l1

mov dl,large
add dl,30h
mov ah,02h
int 21h

mov ah,4ch
int 21h
main endp
end main

数组中有 6 个值,但计数为 7。还要查看当计数在 nochange 块中变为零时会发生什么。它下降到 largefound。它应该跳过它。

你的程序有两个问题:

  • 计数器设置得太高。将其设置为 1 小于数组中元素的数量。这样你就不需要第一个 dec count.
  • 程序流程混乱,这意味着您无法跟踪正在做什么和正在做什么。

与其使用同时复制多个指令的 2 个单独的代码块,不如使用相反的条件跳转来绕过新最大值的设置:

  lea  si, array
  mov  al, [si]      ;First element
  mov  large, al
l1:
  inc  si
  mov  al, [si]      ;Next elements
  cmp  al, large
  jng  NotLarger
  mov  large, al     ;New largest element
NotLarger:
  dec  count
  jnz  l1

注意你不需要写cmp count, 0因为dec count指令已经为jnz l1.

的操作设置了必要的标志

请注意,只需将 l1 标签向上移动一行,您就不再需要单独的 inc si

研究这个例子,看看代码是多么的小和高效!