【问题标题】:Assembler x64 Nasm single string concatenation汇编器 x64 Nasm 单字符串连接
【发布时间】:2016-09-18 19:09:37
【问题描述】:

我是汇编程序新手,尝试执行一些简单的任务,例如输入姓名并获得“嘿,姓名”的答案。到目前为止,我读取输入并将其分配给我未声明的变量,而不是将这个变量放入 rdx 寄存器并在显示器上显示。问题是我不知道如何将 tekst2 变量放入 rdx 而不是替换 tekst;

  section .text

    section .data
tekst db "Hey ", 0ah

global _start
_start:

;read input
mov rax,0 ;numer funkcji sys_read
mov rdi,0
mov rsi,tekst2
mov rdx, 20
syscall
;move input to rbx for later compare
mov rbx,tekst
mov rbx,tekst2

;print
mov rax, 1 
mov rdi, 1 
mov rsi, rbx
mov rdx, 20
syscall
mov rax, 60
syscall

section .bss
tekst2: resw 1

【问题讨论】:

  • 如果有一个函数可以打印你知道如何使用的字符串,你怎么能在 C 中做到这一点?
  • 我从没用过 C
  • 那么您将如何使用您知道的任何其他编程语言来做到这一点?例如单独打印字符串,或者将它们连接成一个字符串,对吗?
  • 因此保留空间并编写一个循环将两个字符串复制到另一个缓冲区中。或者 sys_read 到一个足够大的缓冲区来附加另一个字符串而无需先复制。或者就像我说的,只需通过两次调用 sys_write 分别打印两个字符串。
  • 那么,你认为高级语言在内部做什么,魔法?无论如何,如果您对编程如此陌生,以至于您不知道字符串是如何存储在内存中的*,请首先使用数字。您不需要在开始时做任何字符串,在寄存器窗口的调试器中检查数字值。 (*:您的tekst2: resw 1 在内存中保留 2 个字节,这对于 ASCII 编码中的 2 个字母来说足够了,而您使用 20 长度参数进行系统调用,因此用户输入 3+ 字符将覆盖超出tekst2 的一些内存)

标签: assembly nasm


【解决方案1】:

假设这是一个分配并且范围是显示Hey "entry",这会将输出格式截断为在命令提示符下方有一行,在下一行上方有另一行。

            section .data
  Prompt:   db  10, 9, 'Hey '    
    Ends:   db  10

            section .bss
   Entry:   resb    80

            section .text
    global  _start

   _start:  mov     eax, 1                  ; SYS_WRITE
            mov     edi, eax                ; STDOUT
            mov     esi, Prompt
            mov     edx, Ends - Prompt
            push    rax                     ; We'll need these later to display
            push    rax                     ; another line feed after entry
            syscall             
            push    rsi                     ; Points to Ends, needed later

    ; Get input

            mov      al, 0
            mov     edi, eax
            mov     esi, Entry
            mov      dl, 80
            syscall

    ; Finally display string @ Ends

            pop     rsi                 ; Points to Ends
            pop     rdi                 ; STDOUT
            pop     rax                 ; SYS_WRITE
            mov      dl, 1
            syscall

            xor     rdi, rdi            ; Return code from prologue
            mov     eax, 60
            syscall

从技术上讲,字符串是串联的,只是在视频内存中完成。

另一个版本是您可以通过在Prompt 之后立即声明Entry 来进行隐式连接,

          section .data
  Prompt:   db  10, 9, 'Hey '    
   Entry:   times 80 db 10

然后在您输入后,只需将 6 加到 AL 中已有的值,将其移动到 DL 并将 Prompt & Entry 显示为 1,实现与上一个示例相同的结果。您需要的一切都在附加代码中,只需删除 5 行、移动 5 行并更改 3 个参数,.data 中的新声明将起作用。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多