我正在读一本书:《专业汇编语言》。
我想用动态链接.
我正在使用 AT&T 语法和 GNU 汇编器。
我的电脑有 Ubuntu 12.04(64 位系统)。
我正在尝试使用 cpuid 汇编器操作码显示供应商 ID 字符串,并且
printf C函数代替linux系统调用。
Code of hello.s
.code32
.section .data
output:
.asciz "The processor Vendor ID is '%s'\n"
.section .bss
.lcomm buffer, 12
.section .text
.globl _start
_start:
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
我执行了以下命令:
> $ as -o hello.o hello.s
> $ ld -dynamic-linker /lib/ld-linux.so.2 -o hello -lc hello.o
> $ ./hello
bash: ./hello: Accessing a corrupted shared library
但我收到了上面显示的错误消息,有关损坏的共享库的信息(这就是我想要解决的错误)
我不太关心代码(因为我理解它)
我只是想学习如何使用汇编代码和 GAS 来使用动态链接。
所以如果你有任何汇编代码
使用动态链接 如果您能向我展示您使用的“as”和“ld”命令,我将不胜感激。
PS:如果有人想了解代码的含义:
CPUID 指令使用单个寄存器值作为输入。
EAX寄存器用于确定什么
信息由CPUID指令产生。
根据 EAX 寄存器的值,CPUID
指令将在 EBX、ECX 和 EDX 寄存器中生成有关处理器的不同信息。
信息以一系列位值和标志的形式返回,必须将其解释为正确的含义
此代码利用零选项 (movl $0, %eax) 来检索简单的供应商 ID
来自处理器的字符串。当 EAX 寄存器中放入零值时,CPUID 指令
执行后,处理器返回 EBX、EDX 和 ECX 寄存器中的供应商 ID 字符串,如下所示:
❑ EBX 包含字符串的低 4 个字节。
❑ EDX 包含字符串的中间 4 个字节。
❑ ECX 包含字符串的最后 4 个字节。
字符串值以小端格式放置在寄存器中;
此代码使用标准 C 库函数:printf 和 exit,而不是 Linux 系统调用。