上面讲了一个例子,使用的是small模式。 q1 r* T7 H' D. F! g. g2 B- @+ e
可以看到汇编语言的基本格式为: H7 C$ M4 E# Z
PUBLIC _FOUND
9 L! J1 a0 l/ {3 y# {# T _TEXT SEGMENT BYTE PUBLIC ‘CODE‘8 }- W" z; ]7 N, [" S
ASSUME CS: _TEXT
6 j1 U" _/ a$ T! d v) e _FOUNDPROC NEAR6 p: M3 T+ U1 E% K( p
PUSHBP& M1 }1 e$ y7 ?8 S: Q6 a; ]) i
MOVBP,SP7 U, Q; u6 e* ^
MOVCX,[BP+4]
6 A" n6 k' S/ c& x2 v% I DECCX' ?& X1 V& `( k
MOVSI,[BP+10]3 p1 r9 e* @2 ?% S# z5 Q& U: _3 I
LODSW) o' ~; x) L% m( V2 R# f+ d
MOVDX,1
5 m: p9 [; ^! Y- U# T* ? MOVBX,0+ ~# ] }! s3 C1 Q& \' z7 v% i
COMP:CMPAX,[SI]' A; Z2 B: n( ~5 \3 v/ c+ x9 m
JABIGGER
5 H) ?/ S4 i+ S1 k MOVAX,[SI]
9 U3 |+ d# ]* Q% O, X3 I: } MOVBX,DX
; a( W( S7 J9 j' ~+ X: j/ m BIGGER:INCSI
: l+ g! }; F8 v2 f# L INCSI6 i/ [! n5 c$ a/ K9 h6 P
INCDX, ? Q9 a$ ~6 s2 {. X* k# F
LOOPCOMP5 w8 _$ n1 Y# j+ t1 p( d7 ?
MOVDI,[BP+6] j _* _1 R3 P( O
MOV[DI],AX
+ U+ f6 q0 Q, F MOVDI,[BP+8]- _6 a" H) d; L( j9 ~$ V
MOV[DI],BX
6 y' e; N" R8 W POPBP
0 {' O/ Q! d9 `3 Q9 z* I RET
7 j, L& m$ r" O# E: p$ y _FOUNDENDP$ X, [. k2 F Y3 ]7 Q7 u
_TEXTENDS
2 |9 {& D% x5 N# s$ K END6 [, F. s( S5 g& `( ~; _
为了看得更清楚,我们把代码去掉,留下基本框架:
& ]0 D# n8 W2 t, Q: ~2 G9 K+ r PUBLIC _FOUND
; j$ P7 G- s/ Z. |! h- v2 b _0 M _TEXT SEGMENT BYTE PUBLIC ‘CODE‘
$ P! d4 n/ O: Y6 j) k9 s3 P ASSUME CS: _TEXT- W$ ~5 _" V& U N* o
_FOUNDPROC NEAR3 {4 H' O& h/ C8 j! S
PUSHBP
" L0 |; ?) o. t" ]: Z8 b MOV BP,SP
3 F2 n! ]! ^+ b, t8 p ......... ;从这里开始加入汇编代码" k# q Q( b9 I9 M+ S M- _3 s
.........8 @) `* o( u4 ?
POP BP
) z1 E; y: }7 h- t7 n RET
2 |3 O Y: m- @0 ~ _FOUNDENDP9 I# ^6 B9 o! @& L6 h$ { v
_TEXTENDS+ e% l! {* x5 ?8 ^2 u% @9 z4 w
END
8 V" d$ i- w0 L/ b6 U 这就是在samll下的汇编语言接口框架,在加入代码处,写上你所要完成一定功能的汇编代码,就成为一个可供TC调用的汇编模块。
( w" c" T- c+ E9 L; D 可以看出,代码段是以带下划线的标识符开头的。
1 v4 o4 q) H ^- u4 [! H3 X3 f: W6 t 代码段的标识为_TEXT,由C程序中调用的函数found在这里也是以下划线标出:_FOUND。
# ?+ ?$ `0 k9 n( M6 P$ w) k 下面是代码段的组成:6 P* a/ {+ y9 m" L
_TEXT SEGMENT BYTE PUBLIC ‘CODE‘* A2 n; m4 ]& J' y8 s4 y
................, f4 g2 t" u, T& T( V* N
_TEXT ENDS
; j9 X- D3 Z }' q7 z* D 下面是函数的组成:* ]5 N8 n! [; y! C( C) H _5 [1 @
_FOUND PROC NEAR+ x# w6 B, @' n
.............
7 e- ], v! t7 [8 h" d) h8 d2 I, D _FOUND ENDP
0 j! c! E$ z' L$ j. n. Z. v 在small
9 v8 m) I- ?9 b3 o# s 在这个C函数中,什么代码也没有,只是一个空的框架,我们就用这个框架程序让TC生成一个该程序的汇编代码,看一看TC生成的汇编代码是一个什么样子。
! O$ E, O% v, _) ^* z7 e$ \ 在命令行下进行如下操作:
/ c. @' Z1 y3 n% L6 [ 输入:tcc -S found 回车 /*要注意参数s一定要写成大写,不然会提示错误*/- S$ u6 j1 U1 e0 _" i E; n! Z. N2 [
这时在生成的文件中,有一个found.asm 的汇编代码文件,我们把它打开看一下: N5 k& Q5 s( c& H* r- @
ifndefversion
V5 h+ c9 u! T. D! R# S ?debugmacro4 G `$ u! G- g1 ]7 _; x
endm4 x& n/ ?: n5 I$ {4 Y8 ~, r8 Y
endif
! `/ ?6 k8 E$ O ?debugS "found.c"
( u, ?4 w9 G/ a) }* o( d _TEXTsegmentbyte public ‘CODE‘
& E. \( C$ e; u2 ~ DGROUPgroup_DATA,_BSS
: l, O0 d( C! T assumecs:_TEXT,ds:DGROUP,ss:DGROUP
# @3 k5 }6 ]* E) k5 m; ` _TEXTends! ?3 w6 [/ p7 I$ G4 Z* P
_DATAsegment word public ‘DATA‘
5 n8 D/ ^$ ^4 t. T% { d@labelbyte
" |# X+ @5 G+ h d@wlabelword
) _: f& O7 F- D1 k. e8 r9 U/ S' ^6 [+ N _DATAends" ~. i+ M. K& ~' n, S v
_BSSsegment word public ‘BSS‘
7 t$ i, L* G+ q b@labelbyte9 L$ D: L5 k+ X% {& k, g8 k, J! T
b@wlabelword
# t4 `: i- D# k0 | ?debugC E9943D8F2E07666F756E642E63
* S7 Z( @5 h: J _BSSends
' ?7 w y" J+ s' J1 t# H9 o _TEXTsegmentbyte public ‘CODE‘ ; _TEXT 标识符的段码段
9 D; l4 c4 {$ K6 p0 x( `$ p ?debugC E80007666F756E642E63943D8F2E
, K3 H5 |9 k3 v4 B. A4 Z, Z ?debugL 1
% {" o, Q5 B0 g( N _foundprocnear; 函数found 用下划线标识, _found从这里开始 y: V( P. P$ _1 ~2 i
?debugB
5 n( y" `" U, [) C c* q( V7 V# m | pushbp
5 K6 e f1 l( _+ H movbp,sp. ] p% |+ B2 A9 h- l. @( p
?debugC E3180002001504049 V2 L/ R6 v6 W7 R. }! L* `: \ F
?debugC E60173180A0A00016B180A0800016A180A060001+
6 r0 t9 a, N l$ f' t ?debugC 69040A0400
% n( _. i6 N: m5 r4 L- C ?debugB" t$ E/ G2 {; D& q k4 V
@1: ;从这里开始加入我们自己的汇编代码# N2 ^' w. p; a+ d
?debugL 3
# @6 I. `& Q8 t( X" {0 K popbp
7 w# r n' @$ {! _ ret# `4 e) W& z! Q2 v. ?/ T. ^
?debugC E60173180A0A00016B180A0800016A180A060001+
2 M- M2 C! s4 m/ G" q ?debugC 69040A0400# C1 @. i, o, W6 C) w P: f
?debugE9 @) \/ p* d+ Y
?debugE5 Y/ Q4 y* w- ^7 ?# ?
_foundendp ; 函数_found结束
2 a3 e6 }& Y# m, C/ k& p" x _TEXTends ; 代码段结束2 K$ [; I' _& X; h* m' ~
?debugC E9" s: t+ Z( D6 Y' s% C
_DATAsegment word public ‘DATA‘* R, ]8 @ Y0 d7 o7 b) S9 c
s@labelbyte: S5 ~. W0 [( L% |1 W
_DATAends
$ `3 l4 e9 W9 p Z1 E& [ _TEXTsegmentbyte public ‘CODE‘6 j* t7 @) s0 S/ i) G6 i# H9 f
_TEXTends3 r0 l3 M, A' I
public_found4 b8 x# ^, X1 J; ?# E( i2 I! F8 `
?debugC EA0109
' M* Z# E! K0 L. A9 n R ?debugC E31900000023010000- [" w, F; c/ X( R. v
?debugC EC065F666F756E6419185 p9 {* H4 ]* ]: k4 u/ \
end9 U# q# ~; N2 O& o( i7 ?: k ^
32
, K: J0 b- f: K. O, R8 D# ? 不需要对上面的这个汇编代码作任何改动,你要做的只是在@1:标识符开始处填上需要完成一定功能的汇编代码,那么一个可以由TC正确调用的汇编函数接口就完成了。" C8 U2 e7 f/ _! f& t. V
一般的做法是去掉上面汇编代码中多余的信息,成为看上去很清析的汇编代码,如前所述4 l+ ? S/ C7 y* ^& s }
PUBLIC _FOUND
' r8 S; [2 x$ ^' R+ i, {8 `/ M _TEXT SEGMENT BYTE PUBLIC ‘CODE‘! A3 S; ?! ~/ q6 E R# c
ASSUME CS: _TEXT5 ~- u% R. R5 r$ `5 C' T
_FOUNDPROC NEAR8 q' M: J" d5 m3 K
PUSHBP
8 x9 b0 L( t+ {. Q MOV BP,SP
8 l7 L3 s/ {/ S- ~ ......... ;从这里开始加入汇编代码
( u6 Y2 O1 W- o V$ e P! F; X ........." z( B; _ ]% P2 I8 I/ n" ~
POP BP
9 `1 R+ d1 U X" i$ N1 @' C RET
+ W' r) z% ?2 _* |1 J, K: \) n1 T _FOUNDENDP6 Y/ k" ?+ m3 L2 C8 S7 M
_TEXTENDS
p- E6 Y1 Z( A" u# l) W8 g1 e4 S END* z% W, R( H; j, X
待续。。。。。 |