简单的上层环形圈无限循环

时间:2011-03-27 23:47:39

标签: linux assembly x86 infinite-loop

简单的上层环形圈无限循环

我的代码出了什么问题?

任何建议?

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

.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,-8(%ebp)
loop:           
    #read 1 byte from file 1st byte of data
    movl $3,%eax
    movl -4(%ebp),%ebx
    movl $buffer,%ecx
    movl $1,%edx
    int $0x80
    #buffer contains 1 byte of file
    cmpb $0,buffer
    je program_exit

    pushl buffer
    call convert    #will return converted to %al
    addl $4,%esp
    movb %al,buffer

    #write 1 byte from buffer to file
    movl $1,%edx
    movl $buffer,%ecx
    movl -8(%ebp),%ebx
    movl $4,%eax
    int $0x80
    jmp loop
program_exit:
    movl buffer,%ebx
    movl $1,%eax
    int $0x80

    .type convert,@function
convert:
    pushl %ebp
    movl %esp,%ebp
    movb 8(%ebp),%al #1 byte data in the buffer 
    cmpb $'a',%al
    jl convert_end
    cmpb $'z',%al
    jg convert_end
    addb $32,%al #convert to upper

convert_end:
    movl %ebp,%esp
    popl %ebp
    ret

1 个答案:

答案 0 :(得分:1)

请注意,read(2)通过返回 0发出文件结束信号。您正在尝试通过查找ascii NUL来查找文件的结尾,这在Unix派生系统中非常罕见。 (如果你想要一个简单的方法来创建一个TB大小的文件dd if=/dev/zero of=/tmp/huge bs=1048576 seek=1048576 count=1。整个事情将填充ascii NUL字符。(或整数0,但是你想要解释它。)

您需要修改代码以通过比较read(2)系统调用的返回值来查找文件末尾,而不是通过查看缓冲区中的数据来查找。