Assembly 写入变量程序集,AT&T x86_64
这将是一个非常重要的电流表问题。但我对汇编代码还不熟悉,所以请容忍我在这里 我试图使打印功能成为一个在assemblyat&t x86_64中打印数字的库 使用syscall write函数/重定向到stdout。 lib文件链接到调用函数的主文件,在调用函数printNumber之前,打印值存储在rax寄存器中 库内代码Assembly 写入变量程序集,AT&T x86_64,assembly,x86-64,static-libraries,Assembly,X86 64,Static Libraries,这将是一个非常重要的电流表问题。但我对汇编代码还不熟悉,所以请容忍我在这里 我试图使打印功能成为一个在assemblyat&t x86_64中打印数字的库 使用syscall write函数/重定向到stdout。 lib文件链接到调用函数的主文件,在调用函数printNumber之前,打印值存储在rax寄存器中 库内代码 .global num, printNumber .section .data num: .quad 0 .section .text printNumber: m
.global num, printNumber
.section .data
num: .quad 0
.section .text
printNumber:
mov %rax, %r9
mov $10, %r8
printTop:
xor %rax, %rax
xor %rdx, %rdx
mov %r9, %rax
div %r8
mov %rdx, $num
add $0x30, $num
mov %rax, %r9
mov $1, %rax
mov $1, %rdi
mov $1, %rdx
mov $num, %rsi
syscall
cmp $0, %r9
jne printTop
ret
问题是我似乎无法写入变量num
mov %rdx, num
add $0x30, num
当我使用它作为lib时,我会得到错误分段错误,
但是当我把它作为一个普通的可执行文件使用时,它就工作了
所以我的问题是如何重写里面的值并打印出来
num: .quad 0
如果无法重写程序集中的值,如何将值指向标准输出
mov $1, %rax // Write syscall
mov $1, %rdi // fd where to write/stdout
mov $1, %rdx // Number of values to write
mov $num, %rsi // Pointer to where the output starting from
syscall
我尝试使用设置rbx寄存器的值,但不会打印任何内容,我想所有寄存器都已清除,无法用作系统调用的持有者
mov $num, %rsi
to
mov %rbx, %rsi
//注:
我知道这个函数只打印反转的无符号整数,
但我目前正在努力解决写作问题
我也尝试过寻找解决方案,但很多都是x86或intel结构
主代码
.data
format: .asciz "%d\n"
c: .quad 0
.text
.globl main
main:
push $1337
pop c
push c
pop %rax
call printNumber
movq $60, %rax
movq $0, %rdi
syscall
建造
您的问题是gcc libCalc.s-no pie-nostlib-o libCalc.o正在创建一个可执行文件,而不是一个名为libCalc.o的对象文件
您希望gcc libCalc.s-c-o libCalc.o创建一个真正的对象文件,然后将其放入库中。您的问题是gcc libCalc.s-no pie-nostlib-o libCalc.o正在创建一个可执行文件,而不是一个名为libCalc.o的对象文件
您希望gcc libCalc.s-c-o libCalc.o创建一个真正的对象文件,然后将其放入库中。$num表示num的地址。您显然无法更改该地址。如果要引用该值,则不能使用$。如果你那样做,你会犯什么错误?您只是说,当我删除$sign时,它才起作用,而不是像普通可执行文件那样作为lib文件。在库中也应该是一样的。我得到了分段错误,如果我删除mov%rdx,num并添加$0x30,num,我什么也得不到,顺便说一句,对于$comment,我用错了。这是另一个问题。您对该代码的问题以及调试器中有关故障位置的信息。此外,还可以展示如何调用它,以及如何组装和链接。无论如何,这听起来像是您设法将num放入了只读部分。仔细检查这是您正在运行的确切代码,并且您有显示的.section.data或.data。@Jester:共享库不能使用32位绝对寻址模式,可能他们试图将静态库链接到饼图可执行文件中。mov%rdx,num使用32位绝对寻址模式,与mov%rdx,num%rip不同。$num表示num的地址。显然,您无法更改它。如果要引用该值,则不能使用$。如果你那样做,你会犯什么错误?您只是说,当我删除$sign时,它才起作用,而不是像普通可执行文件那样作为lib文件。在库中也应该是一样的。我得到了分段错误,如果我删除mov%rdx,num并添加$0x30,num,我什么也得不到,顺便说一句,对于$comment,我用错了。这是另一个问题。您对该代码的问题以及调试器中有关故障位置的信息。此外,还可以展示如何调用它,以及如何组装和链接。无论如何,这听起来像是您设法将num放入了只读部分。仔细检查这是您正在运行的确切代码,并且您有显示的.section.data或.data。@Jester:共享库不能使用32位绝对寻址模式,可能他们试图将静态库链接到饼图可执行文件中。mov%rdx,num使用32位绝对寻址模式,与mov%rdx,num%rip不同。
Lib build.
gcc libCalc.s -no-pie -nostdlib -o libCalc.o
ar rcs ../lib/libCalc.a libCalc.o
Build and link.
gcc -no-pie -o bin/file file.s lib/libCalc.a