为啥我的汇编代码无法找到最大的数字?

Posted

技术标签:

【中文标题】为啥我的汇编代码无法找到最大的数字?【英文标题】:Why is my assembly code to find the largest number not working?为什么我的汇编代码无法找到最大的数字? 【发布时间】:2017-03-05 14:44:08 【问题描述】:

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

最大的数字显然是“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

【问题讨论】:

你不能指望在汇编中编写源代码,编译并运行它,然后看到它工作(我承认它有时会发生在我身上......经过大约 20 年的 ASM 编码......有时)。即使它运行并输出正确的结果,也很可能代码的某些部分以与您预期不同的方式工作。您应该始终在调试器中打开新代码并逐条执行它,验证编写过程中使用的每个假设。很多都是假的。 【参考方案1】:

你的程序有两个问题:

计数器设置得太高。将其设置为比数组中的元素数少1。这样您就不需要第一个 dec count。 程序流程混乱,这意味着您无法跟踪正在执行的操作以及正在执行的操作过多。

您最好使用相反的条件跳转来绕过新最大值的设置,而不是使用两个单独的代码块来复制多个指令:

  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

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

【讨论】:

【参考方案2】:

数组中有 6 个值,但 count 为 7。还请查看在 nochange 块中 count 变为零时会发生什么。它直通到 largefound。它应该跳过它。

【讨论】:

虽然,它说避免像'+1'或'thnx'这样的cmets,无论如何谢谢。 (第一次使用***) @gataers 不客气。如果信息有助于表达感谢并最终通过接受它来选择最佳答案,请使用赞成票。

以上是关于为啥我的汇编代码无法找到最大的数字?的主要内容,如果未能解决你的问题,请参考以下文章

如果数字为负,为啥在递归解决方案中找到给定序列中的最大子序列的基本情况返回 0?

找到最大强度给定要在左右跳过的元素数量。请告诉我为啥我的代码对某些测试用例给出了错误的输出?

汇编程序任务 - 数组的最小值和最大值

找到小于给定整数的最大有趣数字

包含 1000 位数字的字符串,在没有数组的情况下找到最大的 5 位数字

如何从数组中的数字中找到最大和最小数字[重复]