Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Asm汇编程序-CX循环从不执行_Loops_Assembly_Dos_X86 16 - Fatal编程技术网

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
    
您可以编写更简单的代码,如果数组中存在数字50,它将错误地添加到总和中。除了上面和下面的条件,还有同等的条件需要照顾

    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