在 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
我正在尝试用 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