2016-11-11 9 views
0

У меня есть файл с именем customer.txt.Как взять строковый ввод из файла на языке ассемблера?

Customer.txt

amin jamal 

Мне нужен пример кода, который принимает строку ввода (amin) из customer.txt файла и распечатать его с помощью 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

Вы имеете в виду, что это занимает не более семи (cfr 'mov rsi, 7') символов? –

+0

@ Майкл Я редактирую свой вопрос. – 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