【问题标题】:Order of execution in this assembly code? (NASM)此汇编代码中的执行顺序? (NASM)
【发布时间】:2016-02-23 05:29:58
【问题描述】:

我尝试寻找答案,但有任何相似之处的示例要么太简单,要么太复杂。我正在将 Paul Carter 的书用于汇编类,所以其中一些宏来自他。即 print_string、print_int 和 print_nl 函数。

鉴于此组装的 sn-p:

segment .data

        output db "Welcome!",0
        string1 db "greater than",0
        string2 db "less than",0
        string3 db "equal to",0
        var_a dd 0Ah

segment .bss

segment .text
        global  _asm_main

_asm_main:

        enter   0,0               ; setup routine
        pusha
    ;***************CODE STARTS HERE***************************

        mov eax, output
        call print_string
        call print_nl

        cmp dword[var_a], 0Ah
        jle label1
        mov eax, string1
        call print_string
        call print_nl
        jmp label3

    label1:
        cmp dword[var_a], 9h
        jg label2
        mov eax, string2
        call print_string
        call print_nl
        jmp label3
    label2:
        mov eax, string3
        call print_string
        call print_nl
    label3:
        cmp dword [var_a], 0
        jle label4
        sar [var_a], 1
        mov eax, dword [var_a]
        call print_int
        call print_nl
        jmp label3
    label4:

    ;***************CODE ENDS HERE*****************************
        popa
        mov     eax, 0            ; return back to C
        leave
        ret

输出为:

欢迎!

equal to
5
2
1
0

我的问题:

我看到它最终如何通过比较到达 label2,打印“等于”消息和一个新行。不过在那之后,我在 label2 中看不到其他比较。那时, label3 是如何被调用的?程序如何“离开”label2?我了解程序集中的所有内容,除了 label2 的结尾(打印“等于”)和 label3 的开头(循环位移并打印数字)之间的所有内容。我错过了什么吗?

label2 执行后,程序的控制权会回到 label1 中第一次调用 label2 的地方吗?还是 label3 执行是因为它是按顺序执行的?

【问题讨论】:

    标签: assembly x86 nasm


    【解决方案1】:

    想象一下,您的代码根本没有标签。机器会一一执行指令,顺着列表往下看。添加标签根本不会改变这种行为;除非有跳转,否则机器仍会转到下一条指令。

    标签为内存地址命名。它们在跳跃时很有用。如果我们没有标签,那么我们可能需要这样做:

    add foo, bar
    sub foo, bar
    mul foo, bar
    jmp -2         ; Fake code for "go up 2 instructions"
    

    使用标签,我们可以为指令的内存地址命名:

      add foo, bar
    thingamajig:       ; This label equals the address of the 'sub' instruction
      sub foo, bar
      mul foo, bar
      jmp thingamajig
    

    【讨论】:

    • 所以在打印“equal to”之后,你是在暗示label3(内存地址)下面的内容仅仅因为它们在序列中是下一个而被执行?
    • 是的。 label3 上面的指令是call print_nl。因此在它被执行之后,下一条指令是cmp dword [var_a], 0
    • 为了清楚起见重复我的观点:标签不会影响直线代码的执行。它们为跳跃提供目标位置。它们还提供存储数据的地址(如果从标记的内存位置加载数据)。
    猜你喜欢
    • 2014-01-03
    • 2016-02-10
    • 2012-05-09
    • 2012-03-23
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2012-10-23
    • 2012-01-04
    相关资源
    最近更新 更多