分享
三行代码  ›  专栏  ›  技术社区  ›  J4ck5ilver

写入变量程序集,AT&T x86\u 64

  •  0
  • J4ck5ilver  · 技术社区  · 2 天前

    这将是一个非常棘手的问题。但我对汇编代码不熟悉,所以在这里请容忍我。

    使用syscall(写入函数/重定向到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
    

    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
    

    已经尝试使用set the rbx register with the value代替,但不会打印任何内容,我猜所有寄存器都被清除用于syscalls,不能用作holder。

    mov $num, %rsi
    to
    mov %rbx, %rsi
    

    //注: 但我现在正在努力解决写问题。

    我也尝试过寻找解决方案,但是很多都是x86格式的或者是英特尔的。

    主代码

    
    .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
    
    

    建造

    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
    
    
    1 回复  |  直到 2 天前
        1
  •  2
  •   Jester    2 天前

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

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