【问题标题】:Inserting a character into a string in NASM将字符插入到 NASM 中的字符串中
【发布时间】:2022-01-17 09:33:14
【问题描述】:

我正在尝试使用 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:.
  • ...哦,天哪。真的就这么简单???它现在打印“liO thgindiM ehT gninruB”。太感谢了。我觉得有点傻,但我也觉得我的教授不应该等到期末考试周才开始教我们组装。

标签: string assembly character nasm


【解决方案1】:

程序在 _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

【讨论】:

  • 我在早期版本的代码中使用了这种方法——当时它返回了“错误:无效的有效地址”。由于某种原因,您的代码现在似乎可以工作,但主要问题仍然存在:它仍然只输出一串 x。
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 2021-12-18
  • 2021-11-15
相关资源
最近更新 更多