- 论坛徽章:
- 0
|
原帖由 bradpitt88 于 2008-5-29 15:53 发表
版主,能不能把修改后的所有源代码贴出来?
当然可以:)
/* filename: ccpuid.s 使用C库的printf和exit的cpupid.s
*
* for x86-64
*
* $ as <-gstabs+> -o ccpuid.o ccpuid.s
* $ ld -o ccpuid ccpuid.o -lc -dynamic-linker /lib64/ld-linux.so.2
* $ ./ccpuid
* The CPU Vendor is AuthenticAMD
* $ echo $? //打印上一个子进程的退出值
* 0
*/
/* 一个不需要链接其他 *.o 的*.s文件,必须定义.data、.text这两个section
* 另外,.bss这个section可选。 必须定义_start,这是程序的第一条指令开始
* 的地方 -- 除非ld时用-e <symbol>指定别的符号为入口地址。 又,_start
* 必须用.globl这个directive指定为全局符号
*/
.section .data
output:
/* .asciz 定义C风格的ASCII字符串,也就是末尾有个'\0' */
.asciz "The CPU Vendor is %s\n"
.section .bss
/* 在BSS段中定义一个buffer,其大小是12个字节 */
.lcomm buffer, 12
.section .text
.globl _start /* 定义_start符号为全局符号 */
_start:
nop
/* %eax清零,来执行cpuid指令 */
xorl %eax, %eax
cpuid
/* vendor ID字符串包含在ebx-edx-ecx中 */
movq $buffer, %rdi
movl %ebx, (%rdi)
movl %edx, 4(%rdi)
movl %ecx, 8(%rdi)
/* 调用printf("The CPU Vendor is %s\n", buffer)
* 注意,x86-64的calling cenvention是:参数从左到右
* 依次为:rdi, rsi, rdx, rcx, r8, r9和rax这7个通用
* 寄存器
*/
movq $output, %rdi
movq $buffer, %rsi
call printf
/* 调用void _exit(int status) */
movq $0, %rdi
call exit
|
|
|