2009-06-24 66 views
2

我正在经历“从头开始编程”。现在我有下面的代码,它应该给出2作为最小的答案,但我得到0作为答案,当我做echo $ ?.汇编代码 - 没有得到正确的答案


    .section .data 
    data_items: 
    .long 3,67,34,222,56,87,9,2,88,22,11,66,900,0 
    .section .text 
    .globl _start 
    _start: 
    movl $0,%edi 
    movl data_items(,%edi,4),%eax 
    movl %eax,%ebx 
    start_loop: 
    cmpl $0,%eax 
    je loop_exit 
incl %edi 
movl data_items(,%edi,4),%eax 
cmpl %ebx,%eax 
jg start_loop 
movl %eax,%ebx 
jmp start_loop 
loop_exit: 
     movl $1,%eax 
     int $0x80
+1

作为汇编程序经验法则,你需要的意见吨。有些人推荐每行1个,这可能稍微多一点,但还不算太远。 – samoz 2009-06-24 12:37:51

+2

在IBM工作时,在1986年,我被告知每行代码中至少有一行注释。这是允许技术较差的人阅读源代码的要求。 – 2009-06-24 12:49:25

回答

1

好,0小于2

既然你JG'ing你要回循环,如果在EAX值比目前更大的EBX,看起来也像是零作为退出代码在这些线路

cmpl $0,%eax 
je loop_exit 

所以,当你在列表中打零这种情况下,它是有效的最低数量和退出条件

0

您不打印结果。你需要调试。 ebx将在循环执行后包含答案。

我知道int 0x80意味着调用一个外部函数,但我不确定细节在那里。好的..根据一个不错的page on interrupt 0x80system call numbers,$ 1是一个退出代码。

它似乎不像你打印的结果。好吧,打印语句的基本格式是这样的:

mov eax, <MEMORY POINTER TO STRING> 
int 21h 

您将需要您的结果转换成字符,把它们放在内存中,然后通过在存储位置到“INT 21H”调用哪个会将它们打印到屏幕上。

尝试一些these examples,看看它们是否适合你。

你能调试代码来验证发生了什么吗?

+0

OP提到`echo $?`这意味着他想要linux的,而不是DOS的API。另外,他不打印该值,但将其作为退出状态返回。 – 2009-06-24 13:21:43

相关问题