assembly 如何在程序集intel x86中打印字符串而不更改数据

li9yvcax  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(93)

我有这一段:

.global main

.data
helloworld: .ascii "Hello world\n"
helloworldend:
goodluck: .asciz "Good Luck!\n"
goodluckend:

.text
main:
    # printf(helloworld)
    movq $1, %rax
    movq $1, %rdi
    movq $helloworld, %rsi
    movq $helloworldend-helloworld, %rdx
    syscall

    # printf(goodluck)
    movq $1, %rax
    movq $1, %rdi
    movq $goodluck, %rsi
    movq $goodluckend-goodluck, %rdx
    syscall

    xorq %rax, %rax
    ret

我必须在不改变数据节的情况下,使它也打印“Hello Luck”。我所做的是在main中添加一个新的数据节:

...
main:
   
.section .data
msg: .ascii "Hello Luck\n"
msgend:

.section .text
start:
    movq $1, %rax
    movq $1, %rdi
    movq $msg, %rsi
    movq $msgend-msg, %rdx
    syscall
...

显然,这是可行的,但我不确定这是不是这个想法..有没有一种不同的方式打印它,而不添加新的数据节,也不改变现有的一个?

v9tzhpje

v9tzhpje1#

内核syscall sys_write需要RDX =字节数和RSI =指向字符串的指针,字符串不必以空值终止,因此只需更改这两个寄存器:

main:
    # printf("Hello ")
    movq $1, %rax
    movq $1, %rdi
    movq $helloworld, %rsi    ; Pointer to "Hello World\n"
    movq $6, %rdx             ; Size of "Hello "
    syscall

    # printf("Luck")
    movq $1, %rax
    movq $goodluck + 5, %rsi  ; Pointer to "Luck!\n"
    movq $4, %rdx             ; Size of "Luck"
    syscall

    # printf("\n")
    movq $1, %rax
    movq $goodluck + 10, %rsi ; Pointer to "\n"
    movq $1, %rdx             ; Size of "\n"
    syscall

    xorq %rax, %rax
    ret

相关问题