2016-11-11 4 views
0

私はcustomer.txtという名前のファイルを持っています。アセンブリ言語でファイルから文字列を入力する方法?

amin jamal 

Customer.txtの

Iはcustomer.txtファイル から文字列の入力(amin)をとり、C printf()機能を使用してそれを印刷するサンプルコードを必要とします。

私のコードは、これは完全な文字列を取ることができない

section .bss 
s: resb 100 

section .data 

fmt: db "%s",10,0 
name: db "customer.txt",0 
mode: db "r+",0 
fp: dq 0 

section .text 

global main 
extern fopen 
extern fgets 
extern printf 
main: 


push rbp 

mov rdi , name; 
mov rsi , mode 
call fopen 
mov [fp] , rax 
mov rdi , s 
mov rsi , 7 
mov rdx , [fp] 
call fgets 
mov rdi , fmt 
mov rsi , s 
call printf 

pop rbp 
ret 

です。

私はNASMアセンブラを使用しています。私のOSは64ビットLinuxです。

アセンブル、コンパイル、実行にはnasmコマンドを使用します。

nasm -f elf64 file.asm 
gcc file.o 
./a.out 

結果 -
amin j

+0

_ "完全な文字列を取ることができません"とはどういう意味ですか?入力と出力の例は何ですか? – Michael

+0

最大7文字(cfr 'mov rsi、7')の文字が必要ですか? –

+0

@Michael私は私の質問を編集します。 – alhelal

答えて

0

あなたのコードは私のために正常に動作します。エラー処理を追加できますか?私はあなたのコードを試して、それは私のためにうまくいった。

section .bss 
s : resb 100 

section .data 
fmt : db "%s",10,0 
name : db "customer.txt",0 
mode : db "r+",0 
err1 : db "Failed To Open File", 10, 0 
err2 : db "Failed To Read File", 10, 0 

section .text 
extern fopen 
extern fgets 
extern printf 

global main 

main: 
    push rbp 

    ; Open the file for reading 
    mov rdi , name 
    mov rsi , mode 
    call fopen 
    cmp rax, 0  ; Check for errors 
    je .errfopen 

    ; read first 7 characters from the open file 
    mov rdi , s 
    mov rsi , 7 
    mov rdx , rax ; File Pointer 
    call fgets 
    cmp rax, 0 ; Check for errors 
    je .errfgets 

    mov rdi, fmt 
    mov rsi, s 
    call printf 

    pop rbp 
    ret 

.errfopen: 
    mov rdi, err1 
    call printf 
    pop rbp 
    ret 

.errfgets: 
    mov rdi, err2 
    call printf 
    pop rbp 
    ret 
関連する問題