【问题标题】:Asm Assembler - CX loop never executesAsm Assembler - CX 循环从不执行
【发布时间】:2023-03-08 14:19:01
【问题描述】:

我有一个向量,我必须将大于 50 ( > 50 ) 的数字的总和放入 AX 寄存器中。

我不明白为什么我的循环在运行时不起作用。首先它将 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

【问题讨论】:

  • 您的向量是字节,但您添加了单词。但这与问题无关。我怀疑你使用错误的调试器,它可能会循环回来,只是它没有为你显示。确保使用单步功能。
  • 要将字节添加到字寄存器,您可以使用这样的中间寄存器:xor dx, dx --- mov dl, byte ptr vect[si] --- add ax, dx
  • 感谢它现在可以正常工作了 :)

标签: loops assembly dos x86-16


【解决方案1】:
.STACK 10h

使用这么小的堆栈,调试器可以很好地在中断发生时立即终止您的程序,让您认为循环没有执行。
指定更大的堆栈。 256 字节是合理的最小值。

adunare:
    add ax, word ptr vect[si]

要将vect[si]byte 添加到AXword,您有多种选择:

  • 使用中间寄存器like zx485 suggested

    • 清除多余的寄存器:

      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
    ja adunare
    jb mic
adunare:
    add ax, word ptr vect[si]
mic:
    loop bucla

你可以写得更简单,如果数组中存在数字 50,它将错误地添加到总和中。除了 abovebelow 条件外,还有 equal 条件需要处理。

    cmp     vect[si], 50
    jna     mic
    add     al, vect[si]
    adc     ah, 0
mic:
    loop    bucla

为了完美,您可以忽略 loop 指令(它以速度慢着称)并改用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2013-04-05
    • 1970-01-01
    相关资源
    最近更新 更多