簡體   English   中英

在裝配中接受用戶輸入嗎? 簡單程序(在macOS上)

[英]Accepting user input in assembly? Simple program (On macOS)

我在使用這個簡單的程序時遇到了一些麻煩,該程序接受了用戶的名字並顯示“ Hello,name here”

到目前為止,這是我的代碼...

%define SYSCALL_WRITE 0x2000004
%define SYSCALL_EXIT  0x2000001
%define SYSCALL_READ  0x2000003

SECTION .data
  prompt db "Enter name "
  text2 db "Hello, "

SECTION .bss
  name resb 16

SECTION .text
  global _start

_start:
  call _printText1
  call _getInput
  call _printText2
  call _printName
  mov rax, SYSCALL_EXIT
  mov rdi, 0
  syscall

_printText1:
  mov rax, SYSCALL_WRITE
  mov rdi, 1
  mov rsi, prompt
  mov rdx, 11
  syscall
  ret

_getInput:
  mov rax, SYSCALL_READ
  mov rdi, 0
  mov rsi, name
  mov rdx, 1
  syscall
  ret

_printText2:
  mov rax, SYSCALL_WRITE
  mov rdi, 1
  mov rsi, text2
  mov rdx, 7  
  syscall
  ret

_printName:
  mov rax, SYSCALL_WRITE
  mov rdi, 1
  mov rsi, name
  mov rdx, 16
  syscall
  ret

當我執行它時,輸出不會顯示“ Hello,”。 輸入的名稱的第一個字母打印在下一個命令行之前...

nMy-MacBook:Assembly username$ ame

名稱的其余部分被接受為命令參數,系統會對此進行回復

-bash: ame: command not found

我到底在做什么錯? 我刪除了_getInput和_printName函數,它仍然只打印“輸入名稱”而不打印“ Hello”。

謝謝。

在組裝中,您必須考慮到每一點; 特別是在進行輸入和輸出時。

以下是您對RDX進行編輯的部分代碼,其中我選擇了任意長度。

最后一行顯示了命令行程序的執行,提示,用戶輸入以及最終輸出。

; reference:
; https://stackoverflow.com/questions/47889972/accepting-user-input-in-assembly-simple-program-on-macos

; lsb_release -a
; Distributor ID: Ubuntu
; Description:    Ubuntu 16.04.3 LTS
; Release:        16.04
; Codename:       xenial

; assemble and link
; nasm -f elf64 -g -F dwarf srsrso_001.s -o srsrso_001.o  && ld srsrso_001.o -o srsrso_001

;%define SYSCALL_WRITE 0x2000004
;%define SYSCALL_EXIT  0x2000001
;%define SYSCALL_READ  0x2000003

SECTION .data
  prompt db "Enter name "
  text2 db "Hello, ",0xa,0

        SYSCALL_WRITE equ       1
        SYSCALL_EXIT  equ       60
        SYSCALL_READ  equ       0

SECTION .bss
  name resb 0xff                ; some length

SECTION .text
  global _start

_start:
 call _printText1
 call _getInput
 call _printText2
 call _printName

  mov rax, 60
  mov rdi, 0
  syscall

_printText1:
  mov rax, SYSCALL_WRITE
  mov rdi, 1
  mov rsi, prompt
  mov rdx, 11
  syscall
  ret

_getInput:
  mov rax, SYSCALL_READ
  mov rdi, 0
  mov rsi, name
  mov rdx, 0xff ; some length
  syscall
  ret

_printText2:
  mov rax, SYSCALL_WRITE
  mov rdi, 1
  mov rsi, text2
  mov rdx, 7
  syscall
  ret

_printName:
  mov rax, SYSCALL_WRITE
  mov rdi, 1
  mov rsi, name
  mov rdx, 0xff ; some length
  syscall
  ret

輸出示例:

$ ./srsrso_001
Enter name David John Lewis Benjamen Kyle Smith-Wenson
Hello, David John Lewis Benjamen Kyle Smith-Wenson

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM