У меня есть кусок кода в файле с именем cpuid.s:Почему эта программа сборки не работает?
.code32
.section .data
output:
.asciz "The processor Vendor ID is '%s'\n"
.section .bss
.lcomm buffer, 12
.section .text
.globl main
main:
movl $0, %eax
cpuid
movl $buffer, %edi
movl %ebx, (%edi)
movl %edx, 4(%edi)
movl %ecx, 8(%edi)
pushl $buffer
pushl $output
call printf
addl $8, %esp
pushl $0
call exit
Мой тип ОС 64-битная, поэтому я добавляю .code32
скомпилировать, и я использую GCC на Ubuntu14.04 для компиляции Этот код:
gcc -o demo cpuid.s
И он скомпилирован успешно. Затем я запускаю демо на терминале, но он запрашивает Segmentation fault (core dumped)
.
Поэтому я использую gdb для отладки. Затем gdb запрашивает:
Program received signal SIGSEGV, Segmentation fault.
__printf (format=0x601078 <buffer> "GenuineIntel") at printf.c:28
28 printf.c: No such file or directory.
Просьба указать, в чем проблема и как ее решить. Благодарю.
Добавить -m32 в вашу командную строку gcc. –
@Paul Griffiths Итак, как его решить? – leohotfn
'.code32' неверен! Вы не можете запустить 32-разрядный код в 64-битном режиме. Вы можете заставить ассемблер генерировать 32-битную сборку с '.code32', но это не запустило ее. Как уже сказал Джонатан Рейнхарт, вам нужно собрать файл в виде 32-битного исходного файла для этого. – fuz