写入可变程序集,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
创建一个真正的对象文件,然后您可以将其放入您的库中。
这将是一个非常电流表的问题。但我是汇编编码的新手,所以请多多包涵。
我正在尝试将打印功能作为一个库来打印汇编中的数字(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
创建一个真正的对象文件,然后您可以将其放入您的库中。