2015-10-21 80 views
2

(使用X86指令集與AT & T語法。)彙編符號比較

我目前正在開發一個程序,找出long值列表中的最小值。

值分配如下

data_items: .long 13,-5,-8,4,-120 

說我有是值的比較,因爲他們可能是負面的問題。我正在查看我的data_items作爲有符號值,在stackoverflow上的一些答案使用jg - 如果提出更大的跳轉。但它不適合我,或者我可能會錯誤地使用它。

我寫了一個小的 「測試」

movl $-7, %ebx #write -7 to register ebx 
movl $2, %ecx  #write 2 to register ecx 

cmpl %ebx, %ecx #compare -7 and 2 
jl end_loop  #if -7 is less than 2, jump 
movl $77, %ebx # move 77 to register ebx 

end_loop: 

結果(寄存器%EBX)應爲-7(或實際上是249,因爲它的兩個互補的),但它是77

如何可以比較有符號值嗎?我是否必須確定他們是否簽名,記住這一點,並且如果他們在比較之前簽名否定他們?

+0

x86爲無符號比較提供了jmp指令集,並對簽名進行比較。你需要查找jmp操作碼並查看哪些是用於簽名比較的。 –

+0

順便說一句,-7將是4294967289,而不是249。你有那裏的dwords。 – harold

+0

@harold你是對的,因爲我正在使用一個長數據類型。但是我感到困惑,因爲當我做「回聲$?」時我得到249回來,這是8位視圖中的-7補碼。也許它削減了領先的零? – ch1ll

回答

2

你的問題基本沒有符號性(jl是一個符號比較正確的,如果你想進行簽名,會使用jb),但操作數爲cmp指令的順序。

這裏有一對夫婦的幫助記憶的想法:

cmp $42, %ecx是一個合法的指令,但cmp %ecx, $42不是。所以,如果你將第二個操作數看作「我正在測試的變量」,將第一個操作數看作「我將它比較的值」,那麼跳轉指令的自然措辭「如果變量小於價值「將是正確的。

或者,如果你不喜歡這樣,記得cmp就像拋出,結果走了減法,只有存儲的標誌,當你讀到這樣sub %ebx, %ecx的指令作爲一個句子,使其成爲最簡單的方法語法正確的是將逗號讀作「from」。 「從 ecx減去ebx - - 如果結果小於0,則jl將跳轉。

通過採用jl所代表的「小於」,並將其插入cmp指令中逗號的位置來讀取指令,會導致錯誤答案。

+0

感謝您的記憶援助;) – ch1ll

1

他們簽名是因爲你這樣說,你永遠不能測試是否簽名。任何位模式也是一個有效的無符號數。沒有什麼可以區分它們,除了你如何使用它們。

在您的示例中,它將ecxebx進行比較,然後在ecx <s ebx時轉至end_loop,事實並非如此。

+0

感謝您的回答!我標記了另一個來自Wumpus Q的答案。由於我對cmp教學有一個理解上的問題,所以很勉強 - 他爲我提供了一個很好的例子來記住它。 – ch1ll