2009-11-30 21 views
5

tôi gặp phải một lỗi trong quá trình chạy của Bộ luật hội sauhội Segmentation Fault

#cpuid using C library Functions 
.section .data 
output: 
.asciz "The Processor Vendor ID is '%s'\n" 
.section .bss 
.lcomm buffer, 12 
.section .text 
.globl main 
main: 
movq $0, %rax 
cpuid 
movq $buffer, %rdi 
movq %rbx, (%rdi) 
movq %rdx, (%rdi) 
movq %rcx, (%rdi) 
pushq $buffer 
pushq $output 
call printf 
addq $8, %rsp 
pushq $0 
call exit 

Nó gặp lỗi phân khúc ở phần C thư viện gọi: Cuộc gọi printf Nó đang chạy trong chế độ x86_64. Bất cứ điều gì tôi đã bỏ lỡ trong quá trình biên dịch mã x64 liên quan đến thư viện c? Hoặc có điều gì đó sai với mã số

Cảm ơn

+2

có thể muốn tăng% RDI bởi một lượng vừa đủ giữa – Managu

+1

Cảm ơn những người của movq tất cả mọi người, tôi đã giải quyết vấn đề. Đó là sai lib mà tôi tải hoạt động tốt sau khi tôi ld nó bằng tay với/lib/ld-linux-x86-64.so.2 và tôi thay thế các chức năng chính với _start. Tôi ld nó là liên kết động. Xin lỗi vì tiếng Anh xấu –

Trả lời

0

không quen thuộc với lắp ráp, do đó, ảnh trong bóng tối: cả hai chuỗi của bạn có bị chấm dứt không?

+0

'.asciz' tự động thêm null kết thúc. – querist

4

Khởi tạo của thư viện runtime C có được gọi không? Điều đó phải chạy đầu tiên để thiết lập stdout. BTW, một dấu vết ngăn xếp sẽ loại bỏ nghi ngờ là nguyên nhân của vấn đề.

Ngoài ra, ngăn chặn chuyển đổi% s tràn bộ đệm bằng% .12s hoặc chỉ cần đặt một byte NUL sau bộ đệm.

0

Bạn cần hủy kết thúc chuỗi bạn viết vào $ buffer, thay vì viết trên đầu một từ ba lần. Ngoài ra, wallyk là đúng: bạn có chắc chắn rằng CRT đang được khởi tạo?

Thành thật mà nói, bạn thực sự tốt hơn khi viết chương trình này, gọi hàm C thư viện, bằng C. Viết mã CPUID như lắp ráp bên trong một hàm __cdecl, có ghi kết quả của nó vào một con trỏ chuỗi. gọi hàm đó từ chương trình C.

void GetCPUID(char *toStr) 
{ 
// inline assembly left as exercise for the reader.. 
// write ebx to *toStr, ecx to *toStr+4, edx to *toStr+8, and 0 to *toStr+12 
} 

void PrintCPUID() 
{ 
    char cpuidstr[16]; 
    GetCPUID(cpuidstr); 
    printf("cpuid: %s\n", cpuidstr); 

} 
2

Các cuộc gọi lắp ráp cho 64bit fprintf được dường như đã thay đổi, do đó, hoặc liên kết các thư viện 32bit hoặc sử dụng đoạn mã sau:

#cpuid using C library Functions 
.section .data 
output: 
.asciz "The Processor Vendor ID is '%s'\n" 
.section .bss 
.lcomm buffer, 12 
.section .text 
.globl main 
main: 
movq $0, %rax 
cpuid 
movq $buffer, %rdi 
movq %rbx, (%rdi) 
movq %rdx, 4(%rdi) 
movq %rcx, 8(%rdi) 
movq $buffer, %rsi #1st parameter 
movq $output, %rdi #2nd parameter 
movq $0, %rax 
call printf 
addq $8, %rsp 
pushq $0 
call exit 
+0

hướng dẫn movq của bạn không tăng '(% rdi)', vì vậy trừ khi tôi thiếu một cái gì đó, 'movq $ buffer, (% rdi)' chỉ đơn giản là sẽ được ghi đè bởi đầu ra 'movq $ của bạn,% rdi' một vài dòng sau. Tôi có thể thấy những gì bạn đang làm, nhưng tại sao lại sử dụng '% rdi' khi bạn chỉ sao chép' $ buffer' sang '% rsi' một vài dòng sau? – querist

Các vấn đề liên quan