метка jmp to 'variable' в сборке (синтаксис AT & T) - PullRequest
0 голосов
/ 04 марта 2012

Я знаю, это может звучать глупо, но я плохо знаком с языком ассемблера, поэтому, пожалуйста, потерпите меня!

У меня следующий код сборки, который является упрощенной версией того, что я пытался сделать.

 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 Ответ

3 голосов
/ 04 марта 2012

Если адрес, на который вы хотите перейти, находится в регистре, вы можете сделать абсолютный косвенный переход:

jmp *%eax

После просмотра вашего кода, похоже, что вы хотите выполнить условный переход.

    cmpl %eax, %ebx
    je label1

    ; this is executed if %eax != %ebx

    jmp end

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

end:
...