Assembly 写入变量程序集,AT&T x86_64

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

这将是一个非常重要的电流表问题。但我对汇编代码还不熟悉,所以请容忍我在这里

我试图使打印功能成为一个在assemblyat&t x86_64中打印数字的库 使用syscall write函数/重定向到stdout。 lib文件链接到调用函数的主文件,在调用函数printNumber之前,打印值存储在rax寄存器中

库内代码

.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