在 NASM 中的字符串中插入一个字符

Inserting a character into a string in NASM

我正在尝试用 NASM 做一个非常简单的组装练习,但我所学的一切都表明这应该有效,但它没有。

它应该遍历字符串“Burning The Midnight Oil”,并将字符反向放入 dest,以便它打印“liO thgindiM ehT gninruB”到输出。它不是。它只是打印 x 的字符串,无论我如何更改它。

我在这里错过了什么?创建 dest 后如何编辑它的内容?我好累。

global _start
section .text
_start: mov rax, 1
        mov rdi, 1
        mov rsi, dest
        mov rdx, len
        syscall
        mov rax, 60
        xor rdi, rdi
        syscall
section .data
src:    db 'Burning The Midnight Oil', 10
dest:   db 'xxxxxxxxxxxxxxxxxxxxxxxx', 10
len:    equ $ - dest

        xor rcx,rcx
        mov rcx,len
        mov rsi,len
loopstart:
        sub rsi,rcx
        mov al,[src+rcx]
        mov [dest+rsi],al
        dec rcx
        jnz loopstart

程序从_start标签处开始执行。您甚至在处理字符串之前就立即显示并退出!将循环代码移动到 _start:.

您的 len: equ $ - dest 包含换行代码 (10)。错了!您必须将该字节留在原处。

len:    equ ($ - dest) - 1   ; Iteration count

写入字符串的最后位置需要使用“Length - 1”,因此写入mov [dest+rsi-1], al

复制字符串只需要使用两个偏移量:一个递增,另一个递减直到零:

_start:
    mov  rdi, len
    xor  esi, esi
loopstart:
    mov  al, [src + rsi]
    mov  [dest + rdi - 1], al
    dec  rdi
    jnz  loopstart

    mov rax, 1
    mov rdi, 1
    mov rsi, dest
    mov rdx, len
    syscall
    mov rax, 60
    xor edi, edi
    syscall