32-битная сборка x86 вопрос - PullRequest
       25

32-битная сборка x86 вопрос

4 голосов
/ 27 августа 2011

Я сейчас нахожусь в процессе изучения ассемблера, и я баловался с утверждениями if.Мой текущий код выглядит следующим образом.

write:
mov eax, 0x4     
sub esp, 4       
int 0x80         

main:
    ; The message has already been pushed to the stack
mov eax, 4
inc eax
cmp eax, 5
je write  

Если я ставлю ret в конце записи: тогда я получаю ошибку шины 10, а если нет, я получаю бесконечный цикл, приводящий к ошибке сегментации.Что я должен сделать, чтобы сделать эту работу?

Ответы [ 2 ]

1 голос
/ 27 августа 2011

Используйте инструкцию call вместо je, чтобы войти в write. ret ожидает, что обратный адрес будет в стеке, но он не будет выдвинут, если вы воспользуетесь прыжком, чтобы попасть туда! Вам также придется вернуть esp к тому, что было, когда вы входили в функцию. Вот лучший пример, основанный на вашем коде:

write:
  mov eax, 0x4
  sub esp, 4       
  int 0x80
  add esp, 4
  ret

main:  ; The message has already been pushed to the stack
  mov eax, 4
  inc eax
  cmp eax, 5
  jne dontwrite  ; skip calling 'write' if eax != 5
  call write
dontwrite:
       ; the rest of the program goes here
0 голосов
/ 30 августа 2011

Попробуйте вместо этого.Нет необходимости вызывать процедуру в вашем примере.

main:  ; The message has already been pushed to the stack
  mov eax, 4
  inc eax
  cmp eax, 5
  jne dontwrite   ; Skip Write

  ; Write
  mov eax, 0x4
  sub esp, 4
  int 0x80

dontwrite:
       ; the rest of the program goes here
...