2017-12-19 43 views
0

私は、ユーザーとの「Hello、ここで名前は」アセンブリでユーザ入力を受け入れていますか? (MacOSで)簡単なプログラム

これは、これまでの私のコードである版画から名前を受け入れ、この単純なプログラムといくつかの問題を抱えている...

%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"という文字を表示せずに "Enter name"という名前しか表示されません。

ありがとうございます。

+0

あなたは、デバッガを使用していますか? – InfinitelyManic

+0

@InfinitelyManic私はちょうど私のMacでターミナルを使用しています。 – srsrso

+0

はい、実際には、デバッグソフトウェアを使用して実行中のアセンブリコードをステップ実行していますか?デバッガを使用すると、障害ポイントを特定するのに役立ちます。たとえば、私はGDBを使用します。しかし、私はコマンドラインからLinux OSまたはOpenBSDを使用しています。 – InfinitelyManic

答えて

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 
+0

また、入出力例も示していますが、65535バイトの入力を要求しましたが、入力バッファのサイズを表示しませんでした。元の 'name resb 16 'ではこれは別のバグです.16文字を超える入力はアプリをクラッシュさせる可能性があります。あなたが書いたのと同じように:*「アセンブリでは、すべてのビットを考慮する必要があります」*、それは記憶領域を含みます。修正してください。 (しばしば、ビルドステップを組み込むことも良いことですが、それは答えよりも疑問に似ていますが、それでもランダムなリーダーで結果を再現しやすくなります)。 – Ped7g

+1

+ Peg7g - 私の変更が役立つことを願っています。ありがとうございました。 – InfinitelyManic

関連する問題