【问题标题】:why this assembly .com file print 2 non-stop?为什么这个程序集 .com 文件不停地打印 2?
【发布时间】:2011-11-05 18:43:55
【问题描述】:

这是在 .com 文件中为 16 位机器编写的汇编代码: 它是 gcd 计算的代码,有 2 个功能: calc_gcd 调用 clac_mod。 calc_mod 工作正常,我假设 calc_gcd 也是如此,但是 calc_gcd 中的打印将数字 2(正确答案顺便说一句)无限次打印到屏幕上。 这是为什么呢?

        org 100h
        mov ax,0006
        mov bx,0002

        call calc_gcd
        mov ah,4Ch
        int 21h 
        msg dw ' ','$'

        calc_mod:   
           start_mod:
           cmp ax, bx
           jbe end_mod
           sub ax,bx
           jmp start_mod
    end_mod: 
        ret

        calc_gcd:

       cmp bx,0000h
       je end_gcd
       call calc_mod
       xor ax, bx
       xor bx, ax
       xor ax, bx
       add ax, '0'
       mov [msg], ax
       mov dx,msg
       mov ah,9
       int 21h  

      call calc_gcd
        end_gcd: 
         ret

【问题讨论】:

  • 您确实需要使用调试器来查看寄存器值是如何弄乱的。

标签: assembly x86 x86-16


【解决方案1】:

您的代码中存在一些逻辑错误:

mov ax,0006        ;ax = 6
mov bx,0002        ;bx = 2
[...]
calc_mod:          ;you don't need 2 labels, choose 1
start_mod:
cmp ax, bx         ;6 = 2?
jbe end_mod        ;exit call
sub ax,bx          ;ax = 6-2 = 4
jmp start_mod      ;loop until ax=bx=2

因此,在这段代码中,您声明了 2 个变量 x=6 和 y=2

然后你减去 x-y 直到 x

所以此时,使用您使用的数字,AX=2 和 BX=2

calc_gcd:
    cmp bx,0000h         ;BX=2 and is never touched in the code
    je end_gcd           ;jmp never taken
    call calc_mod
    xor ax, bx           ;AX = 2 xor 2 = 0
    xor bx, ax           ;BX = 2 xor 0 = 2
    xor ax, bx           ;AX = 0 xor 2 = 2
    add ax, '0'          ;AX = 32h
    mov [msg], ax
    mov dx,msg           ;msg = '2'
    [...]
    call calc_gcd        ;do this again and again
end_gcd:
    ret

在 google 上搜索“gcd 程序集”会为您提供大量代码示例来计算 gcd。

从那里开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    相关资源
    最近更新 更多