开发者

simple upper-casifier loop infinitely

开发者 https://www.devze.com 2023-02-19 22:55 出处:网络
simple upper-casifier loop infinitely what\'s wrong with my code? any advice? my programming environment is linux, emacs, assembly, at&t syntax

simple upper-casifier loop infinitely

what's wrong with my code?

any advice?

my programming environment is 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
 开发者_Go百科   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


Note that read(2) signals an end-of-file condition by returning 0. You're trying to find the end of the file by looking for an ascii NUL, which is very rare on Unix-derived systems. (If you want an easy way to make a terabyte-sized file, dd if=/dev/zero of=/tmp/huge bs=1048576 seek=1048576 count=1. The whole thing will be filled with ascii NUL characters. (Or the integer 0, however you want to interpret it.)

You need to modify your code to find the end of file by comparing the return value of the read(2) system call, not by looking at the data you receive into your buffer.

0

精彩评论

暂无评论...
验证码 换一张
取 消