-1
比方說,我們在組裝這樣一行:從32位到64位將在裝配
.loop:
cmp %esi, %rcx
我知道,一個寄存器用於32位,另一個是64位。但是是否可以將%rcx
轉換爲32位,以便在嘗試運行代碼時不會出現錯誤?我知道我可以使用ecx
,但我想看看是否有可能使用%rcx
比方說,我們在組裝這樣一行:從32位到64位將在裝配
.loop:
cmp %esi, %rcx
我知道,一個寄存器用於32位,另一個是64位。但是是否可以將%rcx
轉換爲32位,以便在嘗試運行代碼時不會出現錯誤?我知道我可以使用ecx
,但我想看看是否有可能使用%rcx
而不是使用32位的%ECX註冊,你想要做的是使用64位%RSI寄存器:
.loop:
cmp %rsi, %rcx
無論您使用什麼尺寸,寄存器寬度必須匹配。 32位寄存器寫操作始終爲零擴展並寫入AMD64的完整64位寄存器。如果您知道%esi是作爲32位值計算或加載的,則%rsi是零擴展到64位的相同值。
這正是我所期待的。現在它是有道理的,我擔心這是不可能的,因爲我沒有將其他寄存器更改爲64位等價物。 – Andrew
你要求做的事情是不可能的,沒有意義。但是,您可以使用%rsi,即64位寄存器,其下半部分爲%esi。編輯:要清楚,我建議你執行64位比較。否則,問題就變成了什麼應該比較一個32位和一個64位值呢? 32位值是無符號還是帶符號? – icecreamsword
嗨, 32位值是無符號的。 – Andrew
有2^64個唯一值可以用64位表示。只有2^32個唯一值可以用32位表示。因此,試圖將一個64位值存儲在一個32位變量中將會丟失數據。相反是不正確的。碰巧,只要你在AMD64上編寫一個32位寄存器,它就會被零擴展到64位。如果您知道寫入%esi的內容,則%rsi是64位,零擴展值。 – icecreamsword