Loops Asm汇编程序-CX循环从不执行
我有一个向量,我必须在Loops Asm汇编程序-CX循环从不执行,loops,assembly,dos,x86-16,Loops,Assembly,Dos,X86 16,我有一个向量,我必须在AX寄存器中输入大于50(>50)的数字之和 我不明白为什么我的循环在运行时不起作用。首先,它将100与50进行比较,跳转到adunare,将100添加到AX,然后退出循环并终止程序 .MODEL SMALL .STACK 10h .DATA vect DB 100,70,3,10,60,200,30 len DB 7 .CODE begin: mov ax,@DATA mov ds,ax mov ax,0 mov cl,len m
AX
寄存器中输入大于50(>50)的数字之和
我不明白为什么我的循环在运行时不起作用。首先,它将100与50进行比较,跳转到adunare,将100添加到AX,然后退出循环并终止程序
.MODEL SMALL
.STACK 10h
.DATA
vect DB 100,70,3,10,60,200,30
len DB 7
.CODE
begin:
mov ax,@DATA
mov ds,ax
mov ax,0
mov cl,len
mov ch,0
mov si, -1
bucla:
inc si
cmp vect[si],50
ja adunare
jb mic
adunare:
add ax, word ptr vect[si]
mic:
loop bucla
mov ah,4ch
int 21h
END begin
有了这样一个小的堆栈,一旦发生中断,调试器就可以很好地终止您的程序,让您认为循环无法执行。指定一个更大的堆栈。256字节是合理的最小值 要将
vect[si]
处的字节添加到AX
中的单词中,您有几个选项:
- 使用中间寄存器
- 清除额外寄存器:
xor dx, dx mov dl, vect[si] add ax, dx
- 在一条指令中从字节扩展到字:
movzx dx, vect[si] add ax, dx
- 清除额外寄存器:
- 无额外寄存器,但使用级联加法:
add al, vect[si] adc ah, 0
cmp vect[si], 50
jna mic
add al, vect[si]
adc ah, 0
mic:
loop bucla
为了达到完美,您可以取消循环
指令(它以速度慢著称),改用dec-cx
jnz-bucla
。这反过来使您有机会不必将CH
归零,而是使用dec cl
jnz-bucla
一切都在一起:
xor ax, ax ; This makes AX=0
mov cl, len
mov si, -1
bucla:
inc si
cmp vect[si], 50
jna mic
add al, vect[si]
adc ah, 0
mic:
dec cl
jnz bucla
mov ah, 4ch ; DOS.Terminate (exitcode is in AL)
int 21h
我已经测试了很多变体。这是一个更快的循环版本:
xor ax, ax ; This makes AX=0
xor si, si
mov cl, len
bucla:
cmp vect[si], 50
jna mic
xor dx, dx
mov dl, vect[si]
add ax, dx
mic:
inc si
dec cl
jnz bucla
向量是字节,但添加单词。但这与问题无关。我怀疑您使用的调试器是错误的,它可能会返回,只是没有显示给您。确保使用单步功能。要向字寄存器添加字节,可以使用如下中间寄存器:
xor-dx,dx--mov-dl,byte-ptr-vect[si]--添加ax,dx
。感谢它现在工作正常:)
cmp vect[si], 50
jna mic
add al, vect[si]
adc ah, 0
mic:
loop bucla
xor ax, ax ; This makes AX=0
mov cl, len
mov si, -1
bucla:
inc si
cmp vect[si], 50
jna mic
add al, vect[si]
adc ah, 0
mic:
dec cl
jnz bucla
mov ah, 4ch ; DOS.Terminate (exitcode is in AL)
int 21h
xor ax, ax ; This makes AX=0
xor si, si
mov cl, len
bucla:
cmp vect[si], 50
jna mic
xor dx, dx
mov dl, vect[si]
add ax, dx
mic:
inc si
dec cl
jnz bucla