導航:首頁 > 編程語言 > 匯編代碼rdi是

匯編代碼rdi是

發布時間:2023-03-14 18:39:37

① 如何將這段匯編語言轉換成C語言

如何將這段匯編語言轉換成C語言?題目分別提供了同一C語言代碼的32位和64位匯編版本:很容易可以得出其源C語言代碼:

int f(int** p){
return (**p=**p+4,*(int*)**p);
}
則函數體的返回值類型是int,參數p的類型是int**,其唯一的語句是return (**p=**p+4,*(int*)**p);
先把結論放在這,節約不想思考的同學的時間,不同編譯器可能會有所不同,lea 0x4(%eax),%ecx指令可能會被編譯器拆開成兩段:mov (%eax),%ecx 和add 0x4,%ecx(對於64位,則是編譯器把lea lea 0x4(%rax),%rcx,拆開成mov (%rax),%rcx 和add 0x4,%rcx,但是效果是一樣的。
根據題目中函數體只有1句代碼的信息,我們至少確定了這個代碼是一個return語句,如此短小的函數當然只需要用到段內跳轉和段內指針,不需要段地址信息,所以指針大小(64位的RIP和32位的EIP)只是偏移量大小,分別為64位(8位元組)和32位(4位元組)。

題目的設問有相當好的引導性,對比查看左邊和右邊的倒數第3個指令,我們可以看出:函數的返回值都是放在eax變數之中,說明返回值的類型大小是4個位元組。而同時,我們知道在C語言中,64位和32位環境下,int類型的大小都是4個位元組,所以第1空的答案不能是只有1位元組的char類型,也不能是在32位環境下大小為4位元組而在64位環境下大小為8位元組的指針類型如char*、int*。綜上,第1空的答案:函數f的返回值類型只能是int。
第2空則是考查C語言函數的參數傳遞,棧式參數傳遞,在call函數f把ip壓入(分別為64位的RIP和32位的EIP)之前,先壓入的是函數的實際參數,其類型暫時不知道,那就得從匯編指令中找出這個信息點:
C語言函數體標志就是:push %ebp→mov %esp,%ebp→函數體內部→pop %ebp→ret(對64位則是:push %rbp→mov %rsp,%rbp→函數體內部→pop %rbp→retq)
兩邊都是同一個簡單的c語句得到的匯編語句(64位和32位),左邊64位的第2、3、4行對應於右邊的第2、3行(64位多用了一個rdi寄存器傳遞參數,可能是編譯器選項不同的緣故,又因為main函數中調用函數f的指令沒有給出,且不一定相同,故不影響判斷)。
兩邊剩下的幾行代碼(左邊2、3、4、5、6、7、8行,右邊2、3、4、5、6、7行)的工作大同小異,從數據流上看(函數體內,對於32位0x8(%ebp)是第一個也是唯一一個參數,對於64位-0x8(%rbp)才是):
*p→eax,*eax→eax,eax+4→ecx(①),*p→edx,ecx→*edx,*eax→eax
可以簡化為:
**p→eax,eax+4→ecx,ecx→**p,***p→eax
再簡化為
**p+4→**p,***p→eax
註:(①)lea 0x4(%eax), %ecx 意思是取有效地址Load Effect Address,相比於mov 0x4(%eax), %ecx使用地址所指向的值*(eax+4)→ecx,lea指令只使用地址的值eax+4→ecx,少做一步。64位也是如此a。
(對於64位則是:
*p→rax,*rax→rax,rax+4→rcx,*p→rdx,rcx→*rdx,*rax→eax
可以簡化為:
**p→rax,rax+4→rcx,rcx→**p,***p→eax
再簡化為
**p+4→**p,***p→eax

看到數據流了,C語言語句自然也就呼之欲出了,即return (**p=**p+4,*(int*)**p)。(逗號,運算符的意思是從左到右計算式子,然後返回最後一個)

注意這里的+4指的是4個位元組,而在64位32位中都一樣,於是初步斷定**p是固定大小類型變數,同時返回值是int類型的,故認為它(**p)是int,所以參數p的類型就是int**。

② 寄存器 rdi與edi什麼關系

DI、EDI、RDI都是抄目的變址寄存襲器,DI用於16位匯編、EDI用於32位匯編、RDI用於64位匯編中,並且RDI向前兼容EDI、DI,EDI向前兼容DI。與之對應的還有SI、ESI、RDI都是源變址寄存器,區別與DI、EDI、RDI類似。

③ arm匯編movb $0, (%rax,%rdi)是給誰賦值

你這個語法屬於AT&T匯編,
movb $0,(%rax,%rdi)意思是將一個位元組的0存入rax+rdi得出的結果對應的地址位置
x86匯編的寫法為movb [rax,rdi], #0

④ 誰幫我把下面每一行的匯編語言解釋翻譯一下,謝謝啦~

我們的事情了我再來吧來吧,這個是誰啊你喲,這個是誰啊,的

⑤ 這段gcc內聯匯編代碼為什麼沒有寫輸出約束

根據您提供的代碼,這是一個包含匯編指令的C程序。其中的匯編指令是使用GCC內聯匯編語法嵌入到C代碼中的。
您所說的「輸出約束」通常是指將匯編指令執行結果寫入C程序中的變數中。在這個例子中,確實沒有在匯編代碼中使用輸出約束。
這是因為這段匯編代碼並沒有產生任何輸出,它只是簡單地將數組a中的每個元素乘以2,並將結果存儲在數組b中。因此,在這種情況下,沒有必要使用輸出約束。

閱讀全文

與匯編代碼rdi是相關的資料

熱點內容
iphone6s單手模式 瀏覽:79
vivo怎麼找刪除的app軟體 瀏覽:852
360裝機大師怎麼用教程 瀏覽:168
高一編程語言是什麼 瀏覽:421
phpword插入圖片 瀏覽:261
數控編程s300什麼意思 瀏覽:871
linuxab壓力測試 瀏覽:818
編程語言為什麼是c 瀏覽:797
悅me只能網關密碼錯誤 瀏覽:844
三星交集工具 瀏覽:939
資料庫中怎麼復製表結構 瀏覽:417
戴爾win10平板裝系統嗎 瀏覽:816
編程的變數名有哪些 瀏覽:124
360版本海島奇兵下載 瀏覽:370
常州ug數控編程培訓哪個學校好 瀏覽:802
資料庫的不等於怎麼寫 瀏覽:664
qq關閉送禮物動畫 瀏覽:128
京東健康碼在哪個文件夾里 瀏覽:891
數據線黑了怎麼消除 瀏覽:883
iphone6快捷鎖屏 瀏覽:55

友情鏈接