为什么我的查找最大数的汇编代码不起作用?
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
。
研究这个例子,看看代码是多么的小和高效!
我是汇编编程的新手,老实说,这是我用计算机编写的第一个代码(用于汇编)。
最大的数字显然是“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
。
研究这个例子,看看代码是多么的小和高效!