写入可变程序集,AT&T x86_64

Writing to a variable assembly, AT&T x86_64

这将是一个非常电流表的问题。但我是汇编编码的新手,所以请多多包涵。

我正在尝试将打印功能作为一个库来打印汇编中的数字(at&t,x86_64) 使用系统调用(写入函数/重定向到标准输出)。 lib 文件链接到调用函数的主文件,打印值在调用函数 printNumber 之前存储在 rax 寄存器中。

库中的代码

.global num, printNumber

.section .data
num: .quad 0

.section .text

 printNumber:

mov %rax, %r9
mov , %r8

printTop:

xor %rax, %rax
xor %rdx, %rdx

mov %r9, %rax
div %r8

mov %rdx,  $num
add [=11=]x30, $num
mov %rax, %r9


mov , %rax
mov , %rdi
mov , %rdx
mov $num, %rsi
syscall

cmp [=11=], %r9
jne printTop


ret

问题是我似乎无法写入变量:num.

mov %rdx,  num
add [=12=]x30, num

当我将它用作 lib 时,是否出现错误分段错误, 但是,当我将它用作普通可执行文件时,它是否有效。

所以我的问题是如何重写里面的值并打印出来?

num: .quad 0

如果无法在汇编中重写值,如何将值指向标准输出

mov , %rax   // Write syscall
mov , %rdi   // fd where to write/stdout
mov , %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 或采用英特尔结构。

主要代码


.data
    format: .asciz "%d\n"
    c: .quad 0

.text
.globl main
main:
    push    37
    pop     c
    push    c
    pop %rax
    call printNumber

movq , %rax
movq [=16=], %rdi
syscall

建造

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

你的问题是 gcc libCalc.s -no-pie -nostdlib -o libCalc.o 正在创建可执行文件而不是目标文件,即使它被命名为 libCalc.o

您希望gcc libCalc.s -c -o libCalc.o创建一个真正的对象文件,然后您可以将其放入您的库中。