我是amd64 x86_64汇编的初学者。
我试图分配一个静态内存区域,然后使用它。
我尝试将内存指针移动到寄存器中
movq .end_data_stack(%rip),%rdx
movq .codata(%rip), %rcx
然后我试着用记忆
movq %rdx, (%rcx)
但我得到了分割错误:
(gdb) set disassemble-next-line on
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/sam/compiler/minimal
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x000055555555514b in main ()
=> 0x000055555555514b <main+18>: 48 89 11 mov %rdx,(%rcx)
我的整个汇编只有38行:
.global main
a.codata:
.data
.skip 40
data_stack:
.data
.zero 400, 0
a.end_data_stack:
.data
.LC0:
.string "It worked: %p\n"
.text
.globl main
.type main, @function
.text
main:
movq a.end_data_stack(%rip),%rdx
movq a.codata(%rip), %rcx
pushq %rbp
movq %rsp, %rbp
leaq .LC0(%rip), %rax
movq %rcx, %rsi
movq %rax, %rdi
movl $0, %eax
call printf@PLT
movq a.end_data_stack(%rip),%rdx
movq %rsp, %rbp
leaq .LC0(%rip), %rax
movq %rdx, %rsi
movq %rax, %rdi
movl $0, %eax
call printf@PLT
movq %rdx, (%rcx)
popq %rbp
ret
我用
gcc -o minimal minimal.S
./minimal
1条答案
按热度按时间bf1o4zei1#
问题的部分原因是:
1.使用movq而不是leaq
1.标签位于错误部分。
以下作品: