2012-03-04 17 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

答えて

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

+2

'call'命令があります。これは戻りアドレスをスタックにプッシュし、呼び出すアドレスにジャンプします。 –

+2

'ret'命令はスタックから戻りアドレスをポップし、スタックに戻る –

関連する問題