九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
學(xué) Win32 匯編[17]: 關(guān)于壓棧(PUSH)與出棧(POP) 之一
記得剛學(xué)多線程的時候, 碰到一個結(jié)構(gòu):
//Delphi 的語法描述PContext = ^TContext;_CONTEXT = record  ContextFlags: DWORD;  Dr0: DWORD;  Dr1: DWORD;  Dr2: DWORD;  Dr3: DWORD;  Dr6: DWORD;  Dr7: DWORD;  FloatSave: TFloatingSaveArea;  SegGs: DWORD;  SegFs: DWORD;  SegEs: DWORD;  SegDs: DWORD;  Edi: DWORD;  Esi: DWORD;  Ebx: DWORD;  Edx: DWORD;  Ecx: DWORD;  Eax: DWORD;  Ebp: DWORD;  Eip: DWORD;  SegCs: DWORD;  EFlags: DWORD;  Esp: DWORD;  SegSs: DWORD;end;

從這個結(jié)構(gòu)中可以基本洞察多線程的基本原理: 
1、在切換到另一個線程之前, 先把當(dāng)前線程在寄存器中的數(shù)據(jù)保存在這個結(jié)構(gòu);
2、重新切回線程時, 再才這個結(jié)構(gòu)中讀出相關(guān)數(shù)據(jù)到寄存器, 從而繼續(xù)運行...

壓棧、出棧也是類似的道理.

一個程序包含若干子程序, 子程序中一般會有自己的參數(shù)或局部變量.
在執(zhí)行這個子程序前, 應(yīng)該先把寄存器中的相關(guān)數(shù)據(jù)暫存一下(子程序也要使用寄存器), 這就是所謂的壓棧(PUSH); 
等子程序執(zhí)行完畢, 再把之前壓到棧中的數(shù)據(jù)取回(而讓程序繼續(xù)執(zhí)行), 這就是所謂的出棧(POP).

什么是 "棧"?

程序把內(nèi)存劃分了若干區(qū)域, 其中有 "全局?jǐn)?shù)據(jù)區(qū)" 和 "局部數(shù)據(jù)區(qū)".

全局?jǐn)?shù)據(jù)所在的位置叫 "堆";
局部數(shù)據(jù)(局部變量、局部常量、子程序參數(shù))所在的位置叫 "棧", 也叫 "堆棧".

對 "堆" 和 "棧", 前人給出了不同的使用規(guī)則:
"堆" 中的數(shù)據(jù)一般是由下到上排列;
"棧" 的數(shù)據(jù)則完全相反, 是由下到上排列.

驗證 "堆" 與 "棧" 不同的數(shù)據(jù)排列方式:
; Test17_1.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data?    GlobalVal1 dd ?    GlobalVal2 dd ?    GlobalVal3 dd ?.codemain proc    LOCAL LocalVal1:dword, LocalVal2:dword, LocalVal3:dword        ;獲取全局變量地址(地址是順序遞增的):    PrintHex offset GlobalVal1  ;00403054    PrintHex offset GlobalVal2  ;00403058    PrintHex offset GlobalVal3  ;0040305C        ;獲取局部變量地址(地址是順序遞減的):    lea eax, LocalVal1    PrintHex eax                ;0012FFBC    lea eax, LocalVal2    PrintHex eax                ;0012FFB8    lea eax, LocalVal3    PrintHex eax                ;0012FFB4    retmain endpend main

壓棧與出棧的順序:
.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val1 dd 111    val2 dd 222    val3 dd 333.codemain proc    push val1    push val2    push val3    ;壓棧完畢, 接著出棧    pop val1    pop val2    pop val3    ;查看取回的數(shù)據(jù):    PrintDec val1  ;333    PrintDec val2  ;222    PrintDec val3  ;111    ;怎么反了? 這就是常說的 "棧中的數(shù)據(jù)是先進(jìn)后出"! 讓后進(jìn)的先出就好了.    retmain endpend main

根據(jù) "棧" 先進(jìn)后出的特點, 寫一個變量換值的程序:
; Test17_3.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val1 dd 111    val2 dd 999.codemain proc    push val1    push val2    pop val1    pop val2    ;現(xiàn)在 val1 和 val2 的值已經(jīng)交換    PrintDec val1  ;999    PrintDec val2  ;111    retmain endpend main

如果僅是交換變量的值, 可以使用 XCHG 指令:
; Test17_4.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    val1 dd 111    val2 dd 999.codemain proc    ;xchg va1, val2 ;指令都不支持對兩個變量直接操作, 需要用個寄存器中轉(zhuǎn)下    mov  eax, val1    xchg eax, val2    mov  val1, eax    PrintDec val1   ;999    PrintDec val2   ;111    retmain endpend main

根據(jù)上面的原理, 也可以方便寫出一個翻轉(zhuǎn)字符串的函數(shù):
; Test17_5.asm.386.model flat, stdcallinclude    windows.incinclude    kernel32.incinclude    masm32.incinclude    debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data    szText db 'Hello World!', 0.codemain proc    ;把字符串中的字符逐個壓入棧中    mov ecx, sizeof szText - 1  ;把字符串長度(將要反復(fù)的次數(shù))給 ecx, 沒包括結(jié)束記號    xor esi, esi                ;清空 esi, 準(zhǔn)備用作數(shù)組索引@@: movzx eax, szText[esi ;循環(huán)讀出并壓棧    push eax    inc esi    loop @B        ;從棧中逐個取出并寫入字符串    mov ecx, sizeof szText - 1    xor esi, esi@@: pop eax    mov szText[esi], al    inc esi    loop @B        PrintString szText  ;!dlroW olleH    retmain endpend main;做這個程序也有更好的方案, 譬如用 movs
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
注冊機音樂
學(xué) Win32 匯編[6]: 偽指令 DUP 與數(shù)組
VB6中的LSet語句和RSet語句詳解
微軟ANI光標(biāo)文件漏洞徹底分析
PE文件格式--------------基本結(jié)構(gòu)信息
Atlantis Word Processor V1.6.5算法分析及注冊機的實現(xiàn)
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服