2016-09-21 178 views
-1

比方說,我們在組裝這樣一行:從32位到64位將在裝配

.loop: 
     cmp %esi, %rcx 

我知道,一個寄存器用於32位,另一個是64位。但是是否可以將%rcx轉換爲32位,以便在嘗試運行代碼時不會出現錯誤?我知道我可以使用ecx,但我想看看是否有可能使用%rcx

+1

你要求做的事情是不可能的,沒有意義。但是,您可以使用%rsi,即64位寄存器,其下半部分爲%esi。編輯:要清楚,我建議你執行64位比較。否則,問題就變成了什麼應該比較一個32位和一個64位值呢? 32位值是無符號還是帶符號? – icecreamsword

+0

嗨, 32位值是無符號的。 – Andrew

+2

有2^64個唯一值可以用64位表示。只有2^32個唯一值可以用32位表示。因此,試圖將一個64位值存儲在一個32位變量中將會丟失數據。相反是不正確的。碰巧,只要你在AMD64上編寫一個32位寄存器,它就會被零擴展到64位。如果您知道寫入%esi的內容,則%rsi是64位,零擴展值。 – icecreamsword

回答

1

而不是使用32位的%ECX註冊,你想要做的是使用64位%RSI寄存器:

.loop: 
    cmp %rsi, %rcx 

無論您使用什麼尺寸,寄存器寬度必須匹配。 32位寄存器寫操作始終爲零擴展並寫入AMD64的完整64位寄存器。如果您知道%esi是作爲32位值計算或加載的,則%rsi是零擴展到64位的相同值。

+0

這正是我所期待的。現在它是有道理的,我擔心這是不可能的,因爲我沒有將其他寄存器更改爲64位等價物。 – Andrew