分享
三行代码  ›  专栏  ›  技术社区  ›  David542

如何跳转到上一条指令

  •  0
  • David542  · 技术社区  · 1 周前

    .globl main
    main:
        movl     $4,     %eax
        dec     %eax
        jnz    ... # jump back to the previous instruction if not zero
        ret
    
    

    如果没有,那么做上述事情的正确方法是什么?我想对应的C应该是:

    int main() {
        char a = 4;
        while (a-- != 0);
    }
    

    以下是我到目前为止的想法,但不确定这是否是正确的方法,或者如何改进(例如,为什么部分通常以一个点开头,比如 .L1

    .globl main
    main:
        movl     $4,     %eax
    DECREMENT:
        dec     %eax
        jnz     DECREMENT
        ret
    
    2 回复  |  直到 1 周前
        1
  •  4
  •   paxdiablo    1 周前

    那是 确切地 jnz 说明:

    .globl main
    main:
        movl    $4, %eax
    prev:
        dec     %eax
        jnz     prev
        ret
    

    请记住,这会产生 prev 可以 被复制。使用它们时,它会在指定的方向找到最近的一个:

    .globl main
    main:
        movl    $4, %eax
    1:
        dec     %eax
        jnz     1b        ; closest '1', going backwards (b).
        ret
    

    main_loop_1 . 数字标签的后缀表示查找标签的方向, b 是向后的, f 是前进。

        2
  •  2
  •   Jonathon Reinhart    1 周前

    使用标签:

    .globl main
    main:
        movl     $4,     %eax
    loop:
        dec     %eax
        jnz     loop
        ret