a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 92|回复: 0

[C语言] TC2.0中怎样调用汇编程序

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
  上面讲了一个例子,使用的是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
  待续。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 12:58 , Processed in 0.238536 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表