2016-11-11 1 views
0

J'ai un fichier nommé customer.txt.Comment prendre une entrée de chaîne à partir d'un fichier dans la langue d'assemblage?

customer.txt

amin jamal 

je besoin d'un exemple de code qui prend entrée de chaîne (amin) à partir customer.txt fichier et l'imprimer en utilisant c printf() fonction.

Mon code est

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 

Cela ne peut pas prendre chaîne complète. J'utilise NASM assembler. Mon système d'exploitation est 64 bits Linux. J'utilise la commande nasm pour assembler, compiler et exécuter.

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

résultats -
amin j

+0

Que signifie _ "ne peut pas prendre la chaîne complète" _ signifie exactement? Quels sont quelques exemples d'entrées et de sorties? – Michael

+0

Voulez-vous dire qu'il faut au plus sept caractères (cfr 'mov rsi, 7')? –

+0

@Michael Je modifie ma question. – alhelal

Répondre

0

Votre code fonctionne bien pour moi. Pouvez-vous ajouter une gestion des erreurs. J'ai essayé votre code et ça a bien marché pour moi.

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