有人能告诉我如何用1字节长的缓冲区读取10个字节吗?

时间:2011-03-27 06:51:38

标签: linux file assembly buffer

有人可以告诉我如何用1字节长的缓冲区读取10个字节吗?

我的编程环境是ubuntu linux,emacs,assembly,at& t syntax

我可以读取文件并将读取数据保存到缓冲区(1byte)

但是如何读取文件的下一个字节并保存到缓冲区?

我编辑内容以粘贴我的努力

.section .data

    .section .bss
    .lcomm buffer,1

    .section .text
    .global _start

_start:
    movl %esp,%ebp
    subl $8,%esp
    #8(%ebp) is 2nd arg == input
    #12(%ebp) is 3rd arg == output

    #open,read,open,write,close
    movl $5,%eax
    movl 8(%ebp),%ebx
    movl $0,%ecx
    movl $0666,%edx
    int $0x80
    #%eax contains input's fd
    #movl to first local var
    movl %eax,-4(%ebp)

    movl $5,%eax
    movl 12(%ebp),%ebx
    movl $03101,%ecx
    movl $0666,%edx
    int $0x80
    #eax contains output's fd
    #movl to second local var
    movl %eax,-12(%ebp)

    #read 1 byte from file 1st byte of data
    movl $3,%eax
    movl -4(%ebp),%ebx
    movl $buffer,%ecx
    movl $1,%edx
    int $0x80

    #read 1 byte from file I expect 2nd byte of data
    movl $3,%eax
    movl -4(%ebp),%ebx
    movl $buffer,%ecx
    movl $1,%edx
    int $0x80

    #buffer contains 1 byte of file
    subb $48, buffer
    movl buffer,%ebx
    movl $1,%eax
    int $0x80

1 个答案:

答案 0 :(得分:1)


jcomeau@intrepid:/tmp$ nasm -f elf -o test.o test.nasm
jcomeau@intrepid:/tmp$ ld -o test test.o
jcomeau@intrepid:/tmp$ ./test
0  # this is what I typed
jcomeau@intrepid:/tmp$ 
jcomeau@intrepid:/tmp$ echo $?
48
jcomeau@intrepid:/tmp$ cat test.nasm
global _start
_start:
 push eax ; for buffer
 mov ecx, esp
 mov edx, 1 ; # bytes to read
 mov ebx, 0 ; stdin
 mov eax, 3 ; read
 int 0x80
 mov ebx, [ecx] ; what we just read
 mov eax, 1 ; exit
 int 0x80

你仍然需要为10个字符设置循环并转换为ATT语法,但这应该让你开始。