在装配中接受用户输入?简单程序(在macOS上)

问题描述 投票:0回答:1

我在这个简单的程序中遇到一些麻烦,该程序接受用户的名字并输出“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”。

谢谢。

assembly nasm x86-64 mach-o
1个回答
1
投票

在大会中你必须考虑到每一点;特别是在进行输入和输出时。

下面是您对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
© www.soinside.com 2019 - 2024. All rights reserved.