почему моя программа asm работает бесконечно - PullRequest
1 голос
/ 28 марта 2011

Я сделал программу под названием embed

Исходный код ниже.

Проблема: Я не знаю, почему эта программа работает бесконечно.

Моя среда разработки: linux, emacs, Assembly, x86, at & t синтаксис

    #usage : embed input output message
    #this program embed message to input's text and make an output file
    #example1:
    #input: "abcde"
    #message: dc
    #output: "abcDe"
    #example2:
    #input: "abcde"
    #message: bcd
    #output: "aBCDe"

    .section .data
    .section .bss
        .lcomm buff,1
    .section .text
    .global _start
_start:
initialize:
    movl %esp,%ebp
    movl $0,%edi
    subl $8,%esp    #cleared at the exit_program
open_r:
    movl $5,%eax
    movl 8(%ebp),%ebx
    movl $0,%ecx
    movl $0666,%edx
    int $0x80
save_rfd:   #save to -4(%ebp)
    movl %eax,-4(%ebp)
open_w:
    movl $5,%eax
    movl 12(%ebp),%ebx
    movl $03101,%ecx
    movl $0666,%edx
    int $0x80
save_wfd:   #save to -8(%ebp)
    movl %eax,-8(%ebp)
loop:
rfd_read:
    movl $3,%eax
    movl -4(%ebp),%ebx
    movl buff,%ecx
    movl $1,%edx
    int $0x80
check_EOF:
    cmpl $0,%eax
    je exit_program
call_func:
    pushl 16(%ebp)  #16(%ebp) is message
    call checkNconvert  #this will change buffer
wfd_write:
    movl $4,%eax
    movl -8(%ebp),%ebx
    movl buff,%ecx
    movl $1,%edx
    int $0x80
jump_loop:
    jmp loop
exit_program:
    addl $8,%esp
    movl $1,%eax
    movl $0,%ebx
    int $0x80

checkNconvert:
    pushl %ebp
    movl %esp,%ebp
    movl 8(%ebp),%ebx   #8(%ebp) is message that passed over
    movb (%ebx,%edi,1),%bl  #message's edi'th character to %bl
    cmpb buff,%bl       #compare
    jne end_checkNconvert
    .equ n, 'a' - 'A'   #n is just number should be used as $n
    subb $n,buff
    incl %edi
end_checkNconvert:
    movl %ebp,%esp
    popl %ebp
    ret

Ответы [ 2 ]

2 голосов
/ 28 марта 2011

В rfd_readwfd_read также) вы загружаете содержимое buff в качестве второго аргумента системного вызова:

movl buff,%ecx

... но вы хотите адрес buff:

movl $buff,%ecx

Итак, вы передаете неверный указатель на системный вызов read, который почти наверняка вернется с %eax = -EFAULT (-14) - но код на check_EOF не проверяет ошибки.

0 голосов
/ 28 марта 2011

Существует одно условие для выхода из цикла. Если вы правы, говоря, что цикл повторяется бесконечно, это потому, что условие выхода никогда не выполняется!

Попробуйте использовать одну таблицу в качестве входных данных. Когда это решит проблему, попытайтесь выяснить, что не так с системным вызовом.

...