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

时间:2017-03-05 14:44:09

标签: assembly x86 masm dosbox

我对汇编编程非常陌生,说实话,这是我在计算机上编写的第一个代码(用于汇编)。

最大数字显然是' 9'但它显示了一些字符(键盘中没有)。为什么这样?日Thnx。

    .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

2 个答案:

答案 0 :(得分:1)

数组中有6个值,但count是7.还要看看nochange块中count变为零时会发生什么。它逐渐变大。它应该跳过它而不是。

答案 1 :(得分:1)

您的计划存在两个问题:

  • 计数器设置得太高。将其设置为 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

研究这个例子,看看代码有多小,效率更高!

相关问题