久久综合伊人噜噜色,日本三级香港三级人妇电影精品,亚洲中文色资源,国产高清一区二区三区人妖

      <small id="r7w9x"></small>
          <td id="r7w9x"></td><sub id="r7w9x"><menu id="r7w9x"><samp id="r7w9x"></samp></menu></sub>
        1. <th id="r7w9x"></th>
          1. 汶上信息港

            標(biāo)題: 匯編中參數(shù)的傳遞和堆棧修正 [打印本頁(yè)]

            作者: hbhdgpyz    時(shí)間: 2008-9-28 16:22
            標(biāo)題: 匯編中參數(shù)的傳遞和堆棧修正
            &nbsp;&nbsp;在 Win32匯編中,我們經(jīng)常要和 Api 打交道,另外也會(huì)常常使用自己編制的類(lèi)似于 Api 的帶參數(shù)的子程序,本文要講述的是在子程序調(diào)用的過(guò)程中進(jìn)行參數(shù)傳遞的概念和分析。一般在程序中,參數(shù)的傳遞是通過(guò)堆棧進(jìn)行的,也就是說(shuō),調(diào)用者把要傳遞給子程序(或者被調(diào)用者)的參數(shù)壓入堆棧,子程序在堆棧取出相應(yīng)的值再使用,比如說(shuō),如果你要調(diào)用 SubRouting(Var1,Var2,Var3),編譯后的最終代碼<SPAN style="COLOR: red">可能</SPAN>是<BR><BR>push Var3<BR>push Var2<BR>push Var1<BR>call SubRouting<BR>add esp,12<BR><BR>也就是說(shuō),調(diào)用者首先把參數(shù)壓入堆棧,然后調(diào)用子程序,在完成后,由于堆棧中先前壓入的數(shù)不再有用,調(diào)用者或者被調(diào)用者必須有一方把堆棧指針修正到調(diào)用前的狀態(tài)。參數(shù)是最右邊的先入堆棧還是最左邊的先入堆棧、還有由調(diào)用者還是被調(diào)用者來(lái)修正堆棧都必須有個(gè)約定,不然就會(huì)產(chǎn)生不正確的結(jié)果,這就是我在前面使用“可能”這兩個(gè)字的原因:各種語(yǔ)言中調(diào)用子程序的約定是不同的,它們的不同點(diǎn)見(jiàn)下表:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p>
            ) S' ^( p; R/ }& H8 ]<TABLE style="WIDTH: 581.25pt; mso-cellspacing: 0cm; mso-padding-alt: 0cm 0cm 0cm 0cm" cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width=775 borderColorLight=#000000 border=1>% `6 ?6 O. [% i5 Y2 `' A  L1 u
            <TBODY>
            / c4 C8 e& B5 v* H; _  ]7 f2 _<TR>- v2 n  p) O% @1 L- {/ I! z; B
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">
            # b" k7 L( Z5 c9 `7 v<P class=MsoNormal><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            0 i0 i& Q" Z0 g1 ~<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">
            : H  B+ J/ I# S+ U) d8 R/ }<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>C</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            $ {5 M: l& ?$ V, j6 A7 ]+ p4 u3 C<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">7 }6 a% _' d3 G" N# z3 S, D
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>SysCall</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            ; Q, ]- h# E5 H1 H* O/ G<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">: v. ?" O8 C, G2 @+ W4 @7 c
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>StdCall</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>0 L6 o: w2 X2 l2 F
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">. q9 {! o$ k% X9 @# B
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>Basic</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>1 E5 Z/ f. u2 |$ D' x* }, z
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">
            # Y: ?/ A7 _; W) L1 i1 N<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>Fortran</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>1 T  k2 y" `- U, a6 G+ g6 \+ Y
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; PADDING-TOP: 0cm">' K8 w: z) f5 y* ^2 M
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>Pascal</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD></TR>
            - h/ U0 w* K3 Y' [* M<TR>
            7 q! z0 h. S( H# Y<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; WIDTH: 28%; PADDING-TOP: 0cm" width="28%">
            4 W3 u- K' l9 E& p8 W8 U<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">參數(shù)從左到右</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>6 V* J% a! v6 ]" V
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">4 p8 b/ H3 @( s1 ~- c- }8 D
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>. _7 e! J3 w/ K8 \5 _. `5 R' l
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">6 ^6 r) k; F9 i3 m' t9 d9 G
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>+ d2 a$ ~7 R+ r
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">0 n( Q" ]- M9 f6 H7 G
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>: S7 M& ?" E) ~( r' n
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">: @, s) Y( Q# O4 ^
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>9 o8 h+ L; X. x9 G3 E
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">6 R5 p' v1 h' l, g8 `
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>4 {4 u0 B3 O0 u/ n# V6 a& C6 n
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            1 ?. C5 x! h# J* [* Z. w<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD></TR>8 s7 V4 H* f8 a9 d
            <TR>& Z/ V: |  B: F. I
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; WIDTH: 28%; PADDING-TOP: 0cm" width="28%">
            ' S' _: c4 c% w# l* v) g3 e<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">參數(shù)從右到左</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            : _7 D$ _. I- _: `4 t<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            , \1 |: U1 X8 m3 e5 K$ f<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>6 c  p" F1 T- w
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            . [$ g8 S5 I2 c8 Z0 F<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            / e3 C$ E& k& W  o& p* j<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            ! n% ?6 ~* O. K( A! e* V<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            . d% H5 P3 L: k: W5 p6 F<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%"># y# m/ A$ S3 z( g/ R/ v; k8 ]; O
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            & e* @2 _9 |3 I) M0 W/ _/ b* ~* \<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            / i, ]& k. J# V0 L: a' R; x; Q<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>8 _) E1 N* c" L  k; G- \7 \% q
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            : i" A8 h( h  v/ W<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD></TR>9 s) y/ B- ^, i9 |  k$ C. v% E
            <TR>
            0 B1 a; Q& [# r* z8 R7 `<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; WIDTH: 28%; PADDING-TOP: 0cm" width="28%">  A* X$ e5 X. v' I+ T
            <P class=MsoNormal><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">調(diào)用者清除堆棧</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            3 X+ Q1 e* G; j, u: t1 N# Y/ E( n% P<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            * P* s1 R  {5 [4 d* ^0 R8 W<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD># A+ x" M0 D% X/ e! O7 t$ y# a
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">( O8 Y& O. P  J; e) @3 L' k
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>2 O2 N. B7 z3 _! Y/ E# q1 ~. g
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">' e$ h" S+ H* j( ]
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            " h& F1 ]$ x0 {1 I) R5 ^+ S% O<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            3 E, k" a5 y5 [2 v<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>1 p) p7 K4 r4 Y5 ]( N7 ]) J4 A& n! f
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">- B7 I+ w) y; X  Q* q+ Y
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
              i- x% y/ w. z+ L<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">4 l3 L+ F$ C- F- E( Q* K
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD></TR>$ Z8 V$ ?1 c1 v& C9 V3 F
            <TR>
            $ G% U, e3 E. h! u& S: Z# c<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #66cccc; PADDING-BOTTOM: 0cm; WIDTH: 28%; PADDING-TOP: 0cm" width="28%">
            / U9 g& A1 l$ ^<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">允許使用</SPAN><SPAN lang=EN-US>:VARARG</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            3 [- l9 [9 e3 ~% O5 x$ ^<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">* B" W* [# X( s/ Q7 S7 n2 y7 r7 u; i
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            0 Z  J) O9 ?' Y" b<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            7 t$ ^2 h. k; ^: A7 `# p. r4 M0 R<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>2 n& {; w3 l8 E* J1 G1 L
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            * b" Y  O4 E4 V6 W' n$ ~, X<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋體; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            : p0 L: F, z& E* D) X! @3 Y) l<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            6 s6 K3 c) B3 ~# {, H<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>7 L+ y7 ?4 s& C  w2 F; F* J  \5 }
            <TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">& {; t) [0 |. H; u
            <P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD>
            : ?8 ]/ ?+ m2 v" ^0 |" m  s$ O<TD style="PADDING-RIGHT: 0cm; PADDING-LEFT: 0cm; BACKGROUND: #ccccff; PADDING-BOTTOM: 0cm; WIDTH: 12%; PADDING-TOP: 0cm" width="12%">
            6 X% t  \9 D; T* @<P class=MsoNormal style="TEXT-ALIGN: center" align=center><SPAN lang=EN-US>&nbsp;</SPAN><SPAN lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋體"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
            . n+ z# U. \; h1 p8 C" i- {. |<P><SPAN lang=EN-US>VARARG 表示參數(shù)的個(gè)數(shù)可以是不確定的,有一個(gè)例子就是 C 中的 printf 語(yǔ)句,在上表中,StdCall 的定義有個(gè)要說(shuō)明的地方,就是如果 StdCall 使用 :VARARG 時(shí),是由調(diào)用者清除堆棧的,而在沒(méi)有:VARARG時(shí)是由被調(diào)用者清除堆棧的。<BR>在 Win32 匯編中,約定使用 StdCall 方式,所以我們要在程序開(kāi)始的時(shí)候使用 .model stdcall 語(yǔ)句。也就是說(shuō),在 API 或子程序中,最右邊的參數(shù)先入堆棧,然后子程序在返回的時(shí)候負(fù)責(zé)校正堆棧,舉例說(shuō)明,如果我們要調(diào)用 MessageBox 這個(gè) API,因?yàn)樗亩x是 MessageBox(hWnd,lpText,lpCaption,UType) 所以在程序中要這樣使用:<o:p></o:p></SPAN></P>
            2 j. b" W! }/ L* C0 S/ \<P><SPAN lang=EN-US>push MB_OK<BR>push offset szCaption<BR>push offset szText<BR>push hWnd<BR>call MessageBox<BR>...<o:p></o:p></SPAN></P>9 A3 u8 h2 e: ]7 e2 q3 E9 }
            <P>我們不必在<SPAN lang=EN-US> API 返回的時(shí)候加上一句 add sp,4*4 來(lái)修正堆棧,因?yàn)檫@已經(jīng)由 MessageBox 這個(gè)子程序做了。在 Windows API 中,唯一一個(gè)特殊的 API 是 wsprintf,這個(gè) API 是 C 約定的,它的定義是 wsprintf(lpOut,lpFormat,Var1,Var2...),所以在使用時(shí)就要:<o:p></o:p></SPAN></P>% F6 r- N7 E( y
            <P><SPAN lang=EN-US>push 1111<BR>push 2222<BR>push 3333<BR>push offset szFormat<BR>push offset szOut<BR>call wsprintf<BR>add esp,4*5</SPAN></P>
            2 _# ?; J: S8 {- O<P><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
            , ?( w  M- c% x( I& q0 @) c& s<P><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
            ! L& |8 w3 j& R3 `4 ]6 f3 ~3 B<P><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>) a( ]/ V, O' l  g8 n8 ]
            <P><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
            . o3 }! m6 O  s0 C<P><SPAN lang=EN-US>&nbsp;<o:p></o:p></SPAN></P>
            * K8 @# V4 s6 U<P><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path=" m@4@5 l@4@11@9@11@9@5 xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0 "></v:f><v:f eqn="sum @0 1 0 "></v:f><v:f eqn="sum 0 0 @1 "></v:f><v:f eqn="prod @2 1 2 "></v:f><v:f eqn="prod @3 21600 pixelWidth "></v:f><v:f eqn="prod @3 21600 pixelHeight "></v:f><v:f eqn="sum @0 0 1 "></v:f><v:f eqn="prod @6 1 2 "></v:f><v:f eqn="prod @7 21600 pixelWidth "></v:f><v:f eqn="sum @8 21600 0 "></v:f><v:f eqn="prod @7 21600 pixelHeight "></v:f><v:f eqn="sum @10 21600 0 "></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><v:shape id=_x0000_s1026 style="MARGIN-TOP: 0px; Z-INDEX: 1; MARGIN-LEFT: 130.25pt; WIDTH: 170.25pt; POSITION: absolute; HEIGHT: 180pt; mso-wrap-distance-left: 3.75pt; mso-wrap-distance-top: 3.75pt; mso-wrap-distance-right: 3.75pt; mso-wrap-distance-bottom: 3.75pt; mso-position-horizontal: right; mso-position-horizontal-relative: text; mso-position-vertical-relative: line" alt="" coordsize="21600,21600" type="#_x0000_t75" o:allowoverlap="f"><?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" /><w:wrap type="square"></w:wrap></v:shape>下面要講的是子程序如何存取參數(shù),因?yàn)槿笔?duì)堆棧操作的寄存器有<SPAN lang=EN-US> ESP 和 EBP,而 ESP是堆棧指針,無(wú)法暫借使用,所以一般使用 EBP 來(lái)存取堆棧,假定在一個(gè)調(diào)用中有兩個(gè)參數(shù),而且在 push 第一個(gè)參數(shù)前的堆棧指針 ESP 為 X,那么壓入兩個(gè)參數(shù)后的 ESP 為 X-8,程序開(kāi)始執(zhí)行 call 指令,call 指令把返回地址壓入堆棧,這時(shí)候 ESP 為 X-C,這時(shí)已經(jīng)在子程序中了,我們可以開(kāi)始使用 EBP 來(lái)存取參數(shù)了,但為了在返回時(shí)恢復(fù) EBP 的值,我們還是再需要一句 push ebp 來(lái)先保存 EBP 的值,這時(shí) ESP 為 X-10,再執(zhí)行一句 mov ebp,esp,根據(jù)右圖可以看出,實(shí)際上這時(shí)候 [ebp + 8] 就是參數(shù)1,[ebp + c]就是參數(shù)2。另外,局部變量也是定義在堆棧中的,它們的位置一般放在 push ebp 保存的 EBP 數(shù)值的后面,局部變量1、2對(duì)應(yīng)的地址分別是 [ebp-4]、[ebp-8],下面是一個(gè)典型的子程序,可以完成第一個(gè)參數(shù)減去第二個(gè)參數(shù),它的定義是:<BR><BR>MyProc proto Var1,Var2 ;有兩個(gè)參數(shù)<BR>local lVar1,lVar2 ;有兩個(gè)局部變量<o:p></o:p></SPAN></P>. u6 z# Q( k( v  b
            <P>注意,這里的兩個(gè)<SPAN lang=EN-US> local 變量實(shí)際上沒(méi)有被用到,只是為了演示用,具體實(shí)現(xiàn)的代碼是:<BR><BR>MyProc proc<BR><BR>push ebp<BR>mov ebp,esp<o:p></o:p></SPAN></P>2 c/ u8 w7 @* z5 d
            <P><SPAN lang=EN-US>sub esp,8<o:p></o:p></SPAN></P>
            6 w! Z+ G9 E0 {<P><SPAN lang=EN-US>mov eax,dword ptr [ebp + 8]<BR>sub eax,dword ptr [ebp + c]<o:p></o:p></SPAN></P>/ ?! o( Q% s' `6 e
            <P><SPAN lang=EN-US>add esp,8<o:p></o:p></SPAN></P>
            4 U% c1 j) Z9 C<P><SPAN lang=EN-US>pop ebp<BR>ret 8<o:p></o:p></SPAN></P>
            3 V" Y9 f% m8 [+ H5 A<P><SPAN lang=EN-US>MyProc endp<BR><BR>現(xiàn)在對(duì)這個(gè)子程序分析一下,push ebp/mov ebp,esp 是例行的保存和設(shè)置 EBP 的代碼,sub esp,8 在堆棧中留出兩個(gè)局部變量的空間,mov /add 語(yǔ)句完成相加,add esp,8 修正兩個(gè)局部變量使用的堆棧,ret 8 修正兩個(gè)參數(shù)使用的堆棧,相當(dāng)于 ret / add esp,8 兩句代碼的效果??梢钥闯?,這是一個(gè)標(biāo)準(zhǔn)的 Stdcall 約定的子程序,使用時(shí)最后一個(gè)參數(shù)先入堆棧,返回時(shí)由子程序進(jìn)行堆棧修正。當(dāng)然,這個(gè)子程序?yàn)榱搜菔緢?zhí)行過(guò)程,使用了手工保存 ebp 并設(shè)置局部變量的方法,實(shí)際上,386 處理器有兩條專(zhuān)用的指令是完成這個(gè)功能用的,那就是 Enter 和 Leave,Enter 語(yǔ)句的作用就是 push ebp/mov ebp,esp/sub esp,xxx,這個(gè) xxx 就是 Enter 的,Leave 則完成 add esp,xxx/pop ebp 的功能,所以上面的程序可以改成:<o:p></o:p></SPAN></P>( m" X" i2 w1 z9 I  F) t
            <P><SPAN lang=EN-US>MyPorc proc<BR>enter 8,0<BR><BR>mov eax,dword ptr [ebp + 8]<BR>sub eax,dword ptr [ebp + c]<BR><BR>leave<BR>ret 8<BR>MyProc endp<o:p></o:p></SPAN></P>! `2 T! q' h* \5 u- @
            <P>好了,說(shuō)到這兒,參數(shù)傳遞的原理也應(yīng)該將清楚了,還要最后說(shuō)的是,在使用<SPAN lang=EN-US> Masm32 編 Win32 匯編程序的時(shí)候,我們并不需要記住 [ebp + xx] 等麻煩的地址,或自己計(jì)算局部變量需要預(yù)留的堆??臻g,還有在 ret 時(shí)計(jì)算要加上的數(shù)值,Masm32 的宏指令都已經(jīng)把這些做好了,如在 Masm32 中,上面的程序只要寫(xiě)成為:<o:p></o:p></SPAN></P>( ~. r  _$ Y& D/ D
            <P><SPAN lang=EN-US>MyProc proc Var1,Var2<BR>local lVar1,lVar2<o:p></o:p></SPAN></P>
            3 q, D3 M2 j6 n# d+ w9 Z( D<P><SPAN lang=EN-US>mov eax,Var1<BR>sub eax,Var2<BR>ret<o:p></o:p></SPAN></P>+ w. c7 c/ I, [4 H5 l2 r
            <P><SPAN lang=EN-US>MyProc endp<o:p></o:p></SPAN></P>7 }- C# W0 s6 L& y
            <P>編譯器會(huì)自動(dòng)的在<SPAN lang=EN-US> mov eax,Var1 前面插上一句 Enter 語(yǔ)句,它的參數(shù)會(huì)根據(jù) local 定義的局部變量的多少自動(dòng)指定,在 ret 前會(huì)自動(dòng)加上一句 Leave,同樣,編譯器會(huì)根據(jù)參數(shù)的多少把 ret 替換成 ret xxx,把 mov eax,Var1 換成 mov eax,dword ptr [ebp + 8] 等等。<o:p></o:p></SPAN></P>
            % O5 a8 ?9 q' S5 w<P>最后是使用<SPAN lang=EN-US> Masm32 的 invoke 宏指令,在前面可以看到,調(diào)用帶參數(shù)的子程序時(shí),我們需要用 push 把參數(shù)壓入堆棧,如果不小心把參數(shù)個(gè)數(shù)搞錯(cuò)了,就會(huì)使堆棧不平衡,從而使程序從堆棧中取出錯(cuò)誤的返回地址引起不可預(yù)料的后果,所以有必要有一條語(yǔ)句來(lái)完成自動(dòng)檢驗(yàn)的任務(wù),invoke 就是這樣的語(yǔ)句,實(shí)際上,它是自動(dòng) push 所有參數(shù),檢測(cè)參數(shù)個(gè)數(shù)、類(lèi)型是否正確,并使用 call 來(lái)調(diào)用的一個(gè)宏指令,對(duì)于上面的 push/push/call MyProc 的指令,可以用一條指令完成就是:<o:p></o:p></SPAN></P>
            ) T$ I" C$ Q9 ^& j* t9 D<P><SPAN lang=EN-US>invoke MyProc,Var1,Var2<o:p></o:p></SPAN></P>3 V) k* l$ y7 J4 n& `
            <P>當(dāng)然,當(dāng)程序編譯好以后你去看機(jī)器碼會(huì)發(fā)現(xiàn)它被正確地?fù)Q成了同樣的<SPAN lang=EN-US> push/push/call 指令。但是,在使用 invoke 之前,為了讓它進(jìn)行正確的參數(shù)檢驗(yàn),你需要對(duì)函數(shù)進(jìn)行申明,就象在 C 中一樣,申明的語(yǔ)句是:<o:p></o:p></SPAN></P>  E9 N4 z; g" i8 d+ U
            <P><SPAN lang=EN-US>MyProc proto :DWORD,:DWORD<o:p></o:p></SPAN></P>
            9 J! T2 j& Q6 Z+ ^3 h, u; U/ A<P>語(yǔ)句中<SPAN lang=EN-US> proto 是關(guān)鍵字,表示申明,:DWORD 表示參數(shù)的類(lèi)型是 double word 類(lèi)型的,有幾個(gè)就表示有幾個(gè)參數(shù),在 Win32 中參數(shù)都是 double word 型的,申明語(yǔ)句要寫(xiě)在 invoke 之前,所以我們一般把它包括在 include 文件中,好了,綜合一下,在 Masm32 中使用一個(gè)帶參數(shù)的子程序或者 Api ,我們只需用:<o:p></o:p></SPAN></P>
            3 B" \) m; T; @9 Y<P><SPAN lang=EN-US>...<BR>MyProc proto :dword,:dword<BR>... <BR>.data<BR>x dd ?<BR>y dd ?<BR>dwResult dd ?<BR>...<BR>mov x,1<BR>mov y,2<BR>invoke MyProc x,y<BR>mov dwResult,eax<BR>... <o:p></o:p></SPAN></P>




            歡迎光臨 汶上信息港 (http://m.junkejituan.com/) Powered by Discuz! X3.5