2016-09-18 3 views
-1

저는 어셈블러에서 새로 왔으며 수행자에게 이름을 입력하고 '안녕하세요 이름'답변과 같은 간단한 작업을 시도합니다. Sofar 나는이 변수를 rdx 레지스터에 넣고 디스플레이에 표시하는 것보다 선언되지 않은 변수에 입력을 읽고 할당합니다. 문제는 tekst2를 변수를 rdx에 넣는 방법을 모른다는 것입니다. 이 가정어셈블러 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

이 과제이며 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 

기술적으로 문자열은 비디오 메모리에서 처리 된 것입니다.

또 다른 버전은,

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

는 다음 입력 한 후, 단순히 AL에 이미 값으로 6을 추가, Prompt 직후 Entry를 선언함으로써 암시 적 연결을 DL 및 화면으로 이동 할 수 있다는 것입니다 프롬프트 & 항목을 하나로 지정하여 앞의 예와 동일한 결과를 얻습니다. 필요한 모든 것은 코드에 첨부되어 있습니다. 5 행을 삭제하고 5 행을 이동하고 3 개의 매개 변수를 변경하면 .data에 새 선언이 적용됩니다.