5

我在运行以下汇编代码时遇到错误

#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

它在 C 库调用的部分遇到分段错误:调用 printf 它正在 x86_64 模式下运行。关于 c 库,我在编译 x64 代码时遗漏了什么?还是代码有问题

谢谢

4

4 回答 4

4

是否调用了 C 运行时库的初始化?必须首先运行才能设置标准输出。顺便说一句,堆栈跟踪将消除对问题原因的怀疑。

此外,防止 %s 转换使用 %.12s 溢出缓冲区,或者只是在缓冲区后放置一个 NUL 字节。

于 2009-11-30T04:21:03.677 回答
2

对 64 位 fprintf 的汇编器调用似乎已更改,因此要么链接 32 位库,要么使用以下代码:

#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
于 2011-07-07T18:09:20.993 回答
0

不熟悉组装,所以在黑暗中拍摄:你的两个字符串都是空终止的吗?

于 2009-11-30T04:13:49.460 回答
0

您需要将写入 $buffer 的字符串以空值结尾,而不是在一个单词的顶部写入三遍。另外,wallyk 是对的:您确定 CRT 正在初始化吗?

老实说,用 C 语言编写这个调用 C 库函数的程序确实要好得多。将 CPUID 代码作为内联汇编写入 __cdecl 函数中,让它将其结果写入字符串指针,然后从一个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 );

}
于 2009-11-30T04:31:28.893 回答