Поддельные результаты простой программы сборки в системе FreeBSD - PullRequest
2 голосов
/ 23 июня 2011

У меня были проблемы с тем, что даже самые простые программы на ассемблере, которые я пишу для Linux, работали на моей машине с FreeBSD.Вот код ошибки (я стараюсь сделать это как можно более простым):

#counts to sixty
 .section .data
 .section .text
 .global _start
_start:
 movl $1, %ecx           #move $1 into ecx
 movl $1, %eax
start_loop:
 addl %ecx, %eax        #add ecx to eax
 cmpl $60, %eax         #compare $60 and eax...
  je end_loop            #if eax = 60 go to end_loop
 cmpl $60, %eax #
  jle start_loop         #jump if eax is < $60...
  jmp start_loop         #...to start_loop

 end_loop:
  movl %eax, %ebx        #move the value of eax into ebx because ebx holds
                         #the return value
  movb $1, %al           #Move $1 into eax (int 1 is the value for the 
                         #exit() syscall
  int $0x80

Машина Linux возвращает ожидаемый результат, который равен шестидесяти, тогда как машина FreeBSD последовательно возвращает 164 для кода возврата.Кто-нибудь знает, почему это?Если да, не могли бы вы объяснить мне, что происходит?Кроме того, я должен отметить, что они оба действительно работают на процессорах x86.Заранее спасибо:)

1 Ответ

2 голосов
/ 23 июня 2011

Обратитесь к Руководству разработчика FreeBSD , и вам нужно сделать:

push %eax
mov $1, %eax
push %eax
int $0x80

потому что:

  1. только регистр системных вызовов передается через регистр %eax, все аргументы в стеке
  2. системный вызов FreeBSD по умолчанию ожидает, что в стеке будет добавлено дополнительное слово, которое будет фиктивным для встроенного использования int $0x80, но обратным адресом, когда вы выполняете системный вызов через батут call kernel_entry (который затем может сделать int $0x80; ret ).

Если вы хотите использовать соглашение Linux (некоторые аргументы syscall в regs, называемые в руководстве «Альтернативное соглашение о вызовах»), вы должны пометить исполняемый файл так, чтобы система знала, что вы используете системные вызовы в стиле Linux.

...