2012-03-04 89 views
0

我知道这听起来很愚蠢,但我对汇编语言很陌生,所以请耐心等待!jmp在程序集中的'变量'标签(AT&T语法)

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

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 

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

+0

你为什么在第36,37行使用'addb'和'movb';如果我没有弄错,这应该是'addl'和'movl'; 'b'后缀用于'bytes' – Hawken 2012-04-22 14:33:22

回答

3

如果你想跳转到的地址在寄存器中,你可以做一个绝对间接跳转:

jmp *%eax 

查看你的代码后,它看起来像你想执行条件跳转。

cmpl %eax, %ebx 
    je label1 

    ; this is executed if %eax != %ebx 

    jmp end 

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

end: 
+0

这不完全像我想做一个条件跳转。这更多的是“调用一个函数”。所以_func是我放置子程序的部分。子程序不知道要返回的位置。我需要一种方式来告诉它。为了用另一种方式来解决这个问题,我可以如何将一个标签的价值存储到某个寄存器中,以便我可以像你所提到的那样间接跳转? – user113454 2012-03-04 02:04:42

+2

有'调用'指令,它将返回地址推入堆栈并跳转到您要调用的地址。 – 2012-03-04 02:06:13

+2

'ret'指令将弹出堆栈的返回地址并跳转回去 – 2012-03-04 02:06:40