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

相關問題