2011-03-27 61 views
1

简单的上级循环无限循环简单的上级循环无限

我的代码有什么问题?

有什么建议吗?

我的编程环境是Linux,emacs的,装配,在&吨语法

.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 
+0

是否因为在文件末尾没有空字符?用鼠标滑块输入文件并键入abcdefghij。如果我将退出条件0更改为'j',它不会无限循环,出什么问题了? – 2011-03-28 00:50:05

回答

1

注意read(2)信号通过一个结束条件文件返回0。您试图通过寻找一个ascii NUL来找到该文件的结尾,这在Unix衍生的系统中非常罕见。 (如果你想要一个简单的方法,使TB级文件,dd if=/dev/zero of=/tmp/huge bs=1048576 seek=1048576 count=1。整个事情会充满ASCII NUL字符(或整数0,但是你要解释它。)

您需要修改您的代码通过比较系统调用的返回值来查找文件的结尾,而不是通过查看收到缓冲区的数据。