2011-03-28 71 views
1

我做了一个叫程序嵌入为什么我的汇编程序运行无限

源代码如下。

问题:我不知道为什么这个程序无限运行。

我的开发环境是Linux,emacs的,装配,X86,在& 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 
+0

您是否尝试过使用调试器? – 2011-03-28 14:36:28

+0

对不起,我没有试过。不幸的是,我不知道如何使用GDB。你有什么想法如何解决这个问题? – 2011-03-28 14:42:52

+0

“无穷无尽”是什么意思?它是否写入任何输出?它消耗CPU时间还是似乎挂起?如果挂起,如果按Ctrl-D会发生什么情况? – 2011-03-28 16:16:39

回答

2

rfd_read(和wfd_read也一样),你装的buff内容作为第二个参数的系统调用:

movl buff,%ecx 

...但你想要的是buff地址:

movl $buff,%ecx 

所以你传递一个坏的指针read系统调用,这几乎肯定会与%eax = -EFAULT(-14)返回 - 但代码check_EOF不检查错误。

0

有一个条件退出循环。如果你说的是无限循环,这是因为退出条件永远不会被满足!

尝试使用单个表格作为输入数据。当这解决了这个问题时,试着找出系统调用有什么问题。

相关问题