日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

C和汇编混合编程---栈平衡

發(fā)布時(shí)間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C和汇编混合编程---栈平衡 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在搞C和匯編混合編程,對(duì)棧平衡有點(diǎn)小理解,記錄一下

  • 當(dāng)我們調(diào)用一個(gè)API或者子程序時(shí)時(shí),API和子程序可以理解為函數(shù),我們不必在返回的時(shí)候平衡棧里面的函數(shù)參數(shù),但C語(yǔ)言庫(kù)函數(shù)要我們自己平衡棧數(shù)據(jù),
    比如下面的程序:
  • #include "stdio.h" #include "windows.h"int main(int argc, char* argv[]) {printf("begin\n");HINSTANCE libHandle;char *dll="user32.dll";libHandle=LoadLibrary(dll);__asm{xor ebx,ebxpush ebxpush 0x61626364push 0x65666768mov eax,esppush ebxpush eaxpush eaxpush ebx mov eax,dword ptr[MessageBox]call eax//mov esp,0x450add esp,12}return 0; }

    這段程序的功能是彈出MessageBox,我們最后平衡棧數(shù)據(jù)用到add esp,12,為什么是12呢?一共push了7次,應(yīng)該是28啊!因?yàn)樵趕tacall標(biāo)準(zhǔn)中,我們是不用考慮MessageBox參數(shù)的,MessageBox一共4個(gè)參數(shù),

    push ebxpush eaxpush eaxpush ebx

    這4個(gè)push是不用我們管得,所以是12。但有一個(gè)我們要注意就是wsprintf,這個(gè)需要我們自己去平衡棧里面的參數(shù)數(shù)據(jù)
    下面是調(diào)試的結(jié)果:
    在運(yùn)行到push 0x65666768,esp的值是

    當(dāng)運(yùn)行完call eax,esp的值

    兩個(gè)值是相同的

    調(diào)用C語(yǔ)言庫(kù)函數(shù)時(shí):

    #include "stdio.h" int main(){char *str="hello\n";__asm{push strcall printf}return 0; }

  • 進(jìn)入asm和出asm時(shí),esp的值要相同。比如說(shuō),我們程序進(jìn)入__asm后,esp的值是0,那么在出asm時(shí),一定要讓esp的值變成0。
    上面的程序,假設(shè)執(zhí)行 xor ebx,ebx前,esp=0,當(dāng)我們出asm時(shí),esp的值一定要為0,不然會(huì)報(bào)錯(cuò),上面的add esp,12就是這個(gè)目的,如果我們把這個(gè)去掉,在運(yùn)行,就會(huì)報(bào)下面的錯(cuò)誤

    在舉個(gè)例子:
  • int main(){__asm{push 0;}return 0; }

    這段程序也會(huì)報(bào)上面的錯(cuò)誤

    寫(xiě)在最后:
    這些是和同學(xué)討論出來(lái)的,如果有什么不對(duì)的地方希望指出來(lái)

    自己很菜,在學(xué)了點(diǎn)匯編后,自己摸索C和匯編混合編程的,很多東西還不懂,會(huì)繼續(xù)努力的。

    以后會(huì)繼續(xù)補(bǔ)充

    總結(jié)

    以上是生活随笔為你收集整理的C和汇编混合编程---栈平衡的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。