2016-11-11 4 views
0

나는 customer.txt이라는 파일을 가지고 있습니다.어셈블리 언어에서 파일의 문자열 입력을받는 방법?

amin jamal 

customer.txt 제가 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 어셈블러를 사용하고 있습니다. 내 운영 체제는 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