простой цикл с верхним регистром бесконечно - PullRequest
1 голос
/ 28 марта 2011

бесконечный простой цикл верхнего кассира

что не так с моим кодом?

любой совет?

моя среда программирования - linux, emacs, сборка, at & t синтаксис

.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 Ответ

1 голос
/ 28 марта 2011

Обратите внимание, что read(2) сигнализирует об окончании файла, возвращает 0.Вы пытаетесь найти конец файла, ища ascii NUL, что очень редко встречается в системах на основе Unix.(Если вам нужен простой способ создания файла размером в терабайт, dd if=/dev/zero of=/tmp/huge bs=1048576 seek=1048576 count=1. Все это будет заполнено символами ascii NUL. (Или целым числом 0, однако вы хотите его интерпретировать.)

Вам нужно изменить свой код, чтобы найти конец файла, сравнивая возвращаемое значение системного вызова read(2), а не просматривая полученные данные в свой буфер.

...