[英]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.