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ライブラリの一部でセグメンテーション違反が発生しましたCalling:callprintfx86_64モードで実行されています。cライブラリに関してx64コードのコンパイル中に見逃したものはありますか?または、コードに何か問題がありますか

ありがとう

4

4 に答える 4

4

C ランタイム ライブラリの初期化が呼び出されていますか? stdout を設定するには、最初にこれを実行する必要があります。ところで、スタック トレースは、問題の原因に関する疑問を解消します。

また、%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

組み立てに慣れていないので、暗闇の中でのショット:両方の文字列がnullで終了していますか?

于 2009-11-30T04:13:49.460 に答える
0

1 つの単語の上に 3 回書き込むのではなく、$buffer に書き込む文字列を null で終了する必要があります。また、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 に答える