如何使用汇编语言从文件中获取字符串输入?

时间:2016-11-11 05:21:03

标签: assembly nasm x86-64

我有一个名为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

1 个答案:

答案 0 :(得分: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