assembly 为什么这个最小集合会出现分割错误?

t5zmwmid  于 2023-01-26  发布在  其他
关注(0)|答案(1)|浏览(118)

我是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
bf1o4zei

bf1o4zei1#

问题的部分原因是:
1.使用movq而不是leaq
1.标签位于错误部分。

  1. printf可能正在重写寄存器值。
    以下作品:
.global main
.data
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:
    leaq a.end_data_stack(%rip),%rdx
        leaq 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

    leaq a.end_data_stack(%rip),%rdx
        leaq a.codata(%rip), %rcx         
        movq    %rdx, (%rcx)
        popq    %rbp
    ret

相关问题