汇编中的jmp到'variable'标签(AT& T语法)

时间:2012-03-04 01:48:49

标签: assembly subroutine att

我知道这可能听起来很愚蠢,但我是汇编语言的新手,所以请耐心等待我!

我有以下汇编代码,这是我试图做的简化版本。

 1  # print.s
 2  # C callable: char* print()
 3  
 4  .data
 5  output:
 6          .asciz "abcd"
 7          
 8  .text
 9  .globl _printbin
10  
11  _printbin:
12          pushl %ebp              # set up stack frame
13          movl %esp, %ebp         # save esp in ebp
14  
15          movl $output, %eax      # put the address of "abcd" in eax                              
16                  
17          xor %ebx, %ebx                  # clear ebx
18          movl $5, %ebx                   # put 5 in ebx (input for func)
19          movl $0, %edx                   # put 1 in edx (index)
20          jmp _func                       # call func
21                  
22  back1:                  
23          xor %ebx, %ebx                  # clear ebx
24          movl $7, %ebx                   # put 7 in ebx (input for func)
25          movl $2, %edx                   # put 2 in edx (index)
26          jmp _func                       # call func
27                  
28  end:            
29          movl %ebp, %esp                 # restore esp
30          popl %ebp                       # restore ebp
31          ret
32  
33  # take the input, add 1 to it, 
34  # then print it to eax at the specified index
35  _func:                                  # num input in %ebx, index is in %edx , print to: %eax
36          addb $0x1, %ebx                 # print the result to eax 
37          movb %ebx, (%eax, %edx)
38          jmp back1                       # how to decide wether to jump to back1 or to end?
39                    
40  .end
41  

问题是,我如何跳转到某种“变量”标签。 (所以有时候我想跳到这个标签,但有时候又是另一个标签......那种想法。)

1 个答案:

答案 0 :(得分:3)

如果要跳转到的地址在寄存器中,则可以进行绝对间接跳转:

jmp *%eax

查看代码后,看起来好像要执行条件跳转。

    cmpl %eax, %ebx
    je label1

    ; this is executed if %eax != %ebx

    jmp end

label1:
    ; this is executed if %eax == %ebx

end: