2012-03-04 3 views
0

Я знаю, это может показаться глупым, но я новичок в ассемблере, поэтому, пожалуйста, несите меня!jmp to 'variable' label в сборке (синтаксис 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

Почему вы используете 'addb' и' movb' в строках 36, 37; это должно быть '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' вытащит адрес возврата из стека и вернется к нему –