2016-09-18 73 views
-1

我是彙編程序新手,嘗試執行一些簡單的任務,如輸入名稱並獲取'嗨名字'的答案。 Sofar我讀取輸入並將其分配給我的未聲明的變量,而不是將此變量放入rdx寄存器並顯示在顯示器上。問題是我不知道如何將tekst2變量放到rdx中,而不是替換tekst;彙編程序x64 Nasm單字符串連接

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 
+0

你怎麼能這樣做在C,給一個函數,打印字符串,你知道如何使用? –

+0

我從來沒有使用C – Spamua3

+0

那麼你會怎麼做它在你知道的任何其他編程語言?例如分別打印字符串,或將它們連接成一個字符串,對嗎? –

回答

0

假設這是一個分配和範圍是顯示​​,這剪斷格式輸出到具有低於命令提示符下的一行和另一上面的下一個。

  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和顯示器提示&作爲一個入口,達到與前一個例子相同的結果。您需要的所有內容都在附加代碼中,所需的全部內容是刪除5行,移動5行並更改3個參數,並且.data中的新聲明將起作用。