2016-09-18 15 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

あなたが知っている他のプログラミング言語ではどうでしょうか?例えば文字列を別々に印刷するか、文字列を1つの文字列に連結します。 –

答えて

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 

技術的には、文字列は連結されているだけで、ビデオメモリで処理されていることになります。

別のバージョンを使用すると、すぐにPromptEntryを宣言することによって

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

を暗黙の連結を行うことができることを、あなたの入力した後、単にALで、既にだ値に6を追加で、DL、ディスプレイに移動プロンプト&エントリを1として、前の例と同じ結果が得られます。必要なものはすべて添付コードにあります。必要なのは、5行を削除し、5行を移動して3つのパラメータを変更し、.dataという新しい宣言が動作するだけです。