为啥我的汇编代码无法找到最大的数字?
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?
找到最大强度给定要在左右跳过的元素数量。请告诉我为啥我的代码对某些测试用例给出了错误的输出?