- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:8 D* C$ k3 B1 y3 ]" b1 [! x9 B' ]- K3 g
9 ?" X1 e% t; u0 V& l8 Z
简单帮助:
& z6 o! Y5 _$ A( ~( I====================
; R, c9 M- E+ H/ F*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
: | \9 C. p+ N& b*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
0 C+ e" W4 s) S! }& O9 g& ~& o# L8 ]0 m4 F- T. S6 S8 z
. F8 C$ o3 W. u1 M; t
搜索空白区:
0 R/ `: q. U# ]# C0 C=====================
D/ U5 V; ?2 t6 W7 O. ~> sfe 0 ; 帮助/ ^; e3 @( a0 @2 N) m4 r0 J# h- E4 H
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes); T2 n0 d& R7 C9 d0 V/ X
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间( h+ x! V2 @; k: q
2 B$ \, G5 N- H二进制拷贝:
% |2 @$ J( f$ ^2 `" `( y. ~============$ n' J% | B" o* a$ Q W$ ^$ \" W
> sfe b ; 帮助: ^& w" R- U, ?' g8 \; Q
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin2 A$ N, F: Q- I( W6 \# a/ j" C
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
: p: b. S3 S5 U> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin/ E5 }" u, S) u8 Y$ J% M. Y! |
> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
8 Q7 O D' K2 p5 {6 _+ o
^6 Y/ [! @" _! s比较文件:# [( u+ u! `$ g9 N" t* k
==============
" F. @4 @$ `, u2 W \7 S7 M> sfe c ; 帮助" `0 W4 C! w: z. e) @
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
/ N/ W' V' l( D8 H+ Y! M> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )5 i( i$ m6 d5 i0 ~0 n
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
- v! `9 W4 {* c* p- f> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 ); K+ l" ^& G6 w$ b. { h/ b
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
- \0 Q% t5 ~6 n1 R> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes- y5 c: R" ?4 F2 A. z+ A
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)& s; Y4 h" E) s- O; F1 o2 H
1 Q& K9 b) b' i- j' ~) p% B
发现16进制的地方:: V7 }' u, r7 N; v- B+ h
====================
( l, o$ @6 r. R/ O$ x( W2 R5 B& k2 F> sfe f ; 帮助" O2 J2 K( P( s: p
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个' F; X$ O$ U5 e* k9 o7 c
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
/ V$ r9 U; p3 _$ V6 X' U) v- B> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
; d5 ?9 ^; v7 j+ _9 c' w> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
7 _. g7 |/ E z! J6 T> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
/ x5 y5 W# ]1 R+ m> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.
5 d& U8 j! ^) T, B
) P0 n- w" S7 @+ W提取语言数据:1 @1 i7 [5 s( n& @- a- C4 J
======================
. L/ V8 J/ s# a% S" i2 J> sfe l ; 帮助1 @* n2 ~8 Y4 R2 T
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据& w8 |9 T5 X/ I) |( z
> sfe l src.bin 200 ; 显示 ID 200 的字符串
) B; d% r0 \8 _( N P& p3 X> sfe l src.bin 200 2 ; 用第三种语言显示字符串
( f4 m6 G; g1 n) Y! ~# x> sfe l src.bin -1 ; 提取第二种语言, R( } A, p% v& \" V, ^4 m
> sfe l src.bin -all ; 提取所有现存语言
7 Y5 ^8 ?9 K7 k> sfe l src.bin 'Testing ; 转换 'Testing' 字符串& H+ { \" x& N
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言); \7 g/ b5 A% i2 D# s5 v5 p
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
/ R% X; w; S0 g5 T" I" S7 ~7 r t. T> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
% y* R4 M2 v0 Y! B+ F> sfe l test.lng ; 检查test.lng 语言包
8 m0 W4 L+ T1 w6 z> sfe lc test.lng ; 检查和更正test.lng 语言包
! l7 s Q- A: a4 K- i9 B/ G
4 p K$ ]5 E1 ]提取菜单:8 }# W* `4 ?3 E4 {& r
=============' ?" w9 A |) k4 t
> sfe m ; 帮助
/ C( K& L+ u! V> sfe m src.bin ; 提取菜单结构和入口6 i9 D+ {" S! K( M5 J- l) _
0 D; D6 T4 m7 E0 ~ s, z9 [ j5 p& I( ? b" [# z
补丁:1 Y' p1 S) h% @) u: x3 K
=========7 K7 B# ?; ~+ N+ J5 ?
> sfe p ; 帮助
4 T8 Q) p# Y. q( F0 N> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin! U) L- L# m5 |4 x* f1 s1 X8 B/ _
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
0 ], x" x, I1 j0 E2 y$ A> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
! K( I; j- h7 o9 K6 U( G/ t
L% D( ]: M: X" c: f6 \; Z& r$ ^
7 D) @# {' b" a6 d1 _$ z编译:
7 g' i7 o5 L, K) @9 o6 l. h==========$ y/ ^, O2 v# s" C; z) Q" V U( q
> sfe a ; 帮助
( S7 J) I! q4 l> sfe a src.asm ; 编译 src.asm' E1 g6 ~. ]& z$ O( J$ t' w$ k
> sfe a src.asm d ; 编译 src.asm, 完整输出
3 v# j0 \6 ?2 i- a> sfe a "mov r12, #1234h" ; 单句编译
4 q6 W$ q2 Y. |6 H7 B# P. b> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译, G' Z- G& e- b" R; m. O
> sfe a src.asm,TST ; src.asm编译成补丁格式
" w0 p# s& W+ x, L0 p0 C> sfe a src.asm,TST p ; src.asm编译成补丁格式
- L+ Z5 C' D9 w0 U> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
7 h) k# M3 z6 X& l% Y% j8 T' H> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
. x# ~3 d, N1 i5 J* e- t> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。$ p6 [! z9 X8 P8 g' r$ L$ ]7 w
6 q4 p; { I+ K# e1 V) j*) See Assembler Part to get more 'assembler' function detail
$ z# r/ k5 J% j9 y R+ r
! z; j" B8 e1 r1 b9 q1 p e D
: |; \/ _0 J% K; q, p! L: R反汇编:
3 o# q% K3 }/ [& @( ?- E=============
# i$ P2 a6 b, Z! P" i& z2 u) n* N> sfe d ; 帮助
6 ~9 b m6 I; P> sfe d src.bin ; 反汇编 src.bin
1 S- j7 ?' E/ S> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
" g8 b, W. Z1 S+ E1 r& H1 i> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
' s; C2 t0 u' x> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A000004 H; b/ H9 O0 N3 k) s4 t
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
0 l) H* r u- b* E9 `! k( ~> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
& E$ j; \6 F3 z, H; m> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
" ^0 L' C6 i, ^; B( ^) ~$ A) q& [$ H> sfe d image.bmp ; 单色图形汇编输出% M8 K, B, [* [ y7 Y8 N
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
0 M( g& O( A% `( P9 I X- A
! P4 w- w) Z) T( P调试:0 L, b, S2 K% d2 {' i& i7 g
========= v( G% d$ Q5 X5 j; x0 \
> sfe r ; 帮助! g% O8 h6 A% E) ~& n4 z4 w
> sfe r src.bin ; 运行 src.bin2 Q- h$ F7 B8 D# I
> sfe r src.asm ; 运行 src.asm 汇编文件
) E7 }% V& V6 Q0 r> sfe r src.asm ,n ; 同上, 正常输出' g( @# A1 H+ a3 ^& @
> sfe r src.bin,200 ; 从 0x200 地址开始运行
3 F$ s/ C. L# ?> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200- V n: T7 |. m* G0 o
> sfe r src.bin b00000 ; 以 B00000 为基址运行
7 |- K/ U; h8 }" c/ p+ v6 o> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
7 H4 g3 P+ U; {- |2 t" t/ o D" d> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行) [. `) T, t% k% a f
' X( R6 T/ C, W u$ g2 p1 P
/ H6 Q6 {% G. D交互调试:1 ^- Z5 w6 g5 D1 V6 w! |* z9 v1 ^
======================( E6 Q- m- H& Q0 ?1 O) M5 Y
> h ; 帮助! j2 A' f5 _, g. G
> g a00000 ; 到地址 a00000 x3 T: A6 i6 R
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
, K) d! Z2 q% v6 t" y7 p- F> d ; dump 内存 (现在地址)
* O5 ?$ O. D6 ~4 }( h. R$ b> d a00000 ; dump a00000 开始的内存
* M! r3 b+ a/ L2 E; E> d a00000 200 ; dump a00000 开始的内存, 大小 0x2006 D2 O! t/ y& a7 f/ g7 ], Z
> d r ; dump 注册
4 W+ N7 y# f' n# e> a ; 单句汇编
; Q+ G) M; j7 C) a w! a. ?4 t> a c7d530 ; 单句汇编地址在 c7d530+ \: [; Q- g t/ r% {, Y7 i
> u ; 显示反汇编3 i9 M6 R! M1 y. e: C& Y8 X) ~& o
> u a00020 ; 显示地址 a00020的反汇编
/ |+ F3 K+ V0 o9 G D8 g4 W! U> r ; 在现在的地址上执行一条语句: d, C% t, M. O% d2 H" x- e. o
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)" R1 S% f( m* h) _ v9 m4 p2 i5 `
> r 0 ; 运行到返回语句8 B# @$ o5 K- V1 b0 }! Q6 G
> r -c7d580 ; 运行到地址 c7d580
4 `3 J& B L* k7 @( w* E4 [: D9 I> q ; 退出
/ {# T) f: N. B% |. ?+ |. F: V
, T5 a; ]& g* M* U7 `) T$ m+ y*) 所有未声明的语句都会改变当前地址。5 Y4 M, N, J8 o6 c
9 J$ } e9 y$ r, }' W+ K9 o( s) f
3 r- B0 ~) C8 M
特别的助记符:7 ~+ g2 Z* o9 D+ F
============================
E& W/ B5 _0 J& A*) 所有C166的汇编格式* p: B) L: h \- \. e# h. L
*) 分号用于注释 (在一行的任何地方)* L9 o. i+ J% A9 W
*) 特别的助记符如下 :* l! Q' {0 n$ K+ B
#include filename ; 包含文件(各种定义)
% g, D7 u9 v1 \& B$ j" a5 k #define var value ; 设置替代变量 var = value# S+ P. a+ [2 V" M
var equ value ; 变量取值 var = value; V+ x" ] f8 Y% ?/ Q' D
db 'X',36h ; 定义 byte(s) 数据区" R$ F! m. w" x$ y
dw 1234h,0,'AB' ; 定义 word(s) 数据区* n; ~+ L; N7 t: |- ?
org ; 设定当前地址
' G g' y& M3 |/ I2 ?* Q base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
! }( ^% z8 e( F8 e, ^0 m r, [. ~2 ` end ; 结束记号 B9 q3 s A. {' K
;#name XXX.string ; 定义补丁名称 (XXX)# [6 {( Q$ P, X( C" a/ U
' ; 注释将一起进入补丁
8 m' h* f* b% } '' ; 注释将一起进入补丁,加回车) t; d- X0 c! a; J
'; ; 以下内容将全部是注释,直到出现 ''
) U5 {, e5 ^( k V: w( w9 x! N ;' ; 注释将一起进入补丁0 p/ W: ]3 Y0 u& _
+ - * / % ; 加, 减, 乘, 除, 求模 操作! ]; o8 O: d( N
>> > < << ; 右移左移操作% b: g8 s8 r& F) o- s0 ?0 ~( w
& && | || ^ ^^ ; 与, 或, 与非操作
7 |# }8 e) L5 |; L0 V7 g val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
+ z" A$ A- F1 Z6 o" P% u page(value), ' ^& _2 u# v' Y0 ^/ j
pag(value),
! T+ s7 J/ A1 J/ X" C7 x+ V p(value) ; 页值 (= value / 0x4000)
3 U7 [, \& t) S" a# \ pof(value),7 P$ D0 f; Z' N S% l
q(value) ; 页偏移值 (= value mod 0x4000)4 v) J& z% z; `0 i+ F2 \
segment(value),. O0 e$ |# C- A" W! c+ c+ q. F
seg(value),: j4 t& k' e2 @/ |
s(value) ; 段值 (= value div 0xFFFF)# {6 p X3 C1 ?9 q
offset(value),
9 e$ D, U' o- a+ ]1 E/ O7 d8 w- s ofs(value),
. f( V; I# G9 ]5 U k sof(value),
* k# n/ H) _& P o(value) ; 段偏移值 (= value mod 0xFFFF)9 v2 F' F4 A" k: A
; I% k- A% ^$ Z- e, b. t8 o( t
*) 例子:) w/ [7 l1 \& K5 O1 C) s
( t3 e# K) [ };--- Testing ---5 O. w5 ^9 p+ B. V9 u
. O# R) ~. H) J B
base 0A00000h ; 自动转换文件地址为 SL45 内存地址
# A3 E1 W# W5 M: u
6 B" g f4 ~& M$ F0 S, g$ t#ifdef ME45
! z6 d% p- s( \: T" |1 u0 S4 @ #include me45.inc7 G5 g& g- [ \* d& r; n
#else
7 I( G7 V/ Q ] #include sl45.inc
0 y3 N6 F& Q5 M- _! a8 R( K# T$ B1 D #define FreeRAM 37h:3600h
( n6 Y8 }: W6 e+ F C #define memcpy 0c7b384h0 g( K4 M' k4 S+ k# ~
#endif
9 @: L# Y) \" Y' @ x+ s$ X8 B6 o5 ^+ }5 a
;#name TST. Test Patch ; 补丁名( M( v: _6 k2 s" [/ Y- G" T
% K. [7 S' X6 ^2 _ B/ u2 n'Firmware : sl45v56( l& E; E; v% O8 b! k
'Author : rizapn9 k- y# x6 J! C0 o; }7 @2 Q$ {
'Updated : Aug 18, 2004
( c W- W+ J% |5 o! U7 ]) X, H2 H
org 0c7e000h+ U1 m/ _: x3 D7 B
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移) h% B8 j9 a4 l7 u
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
$ g( K) y) J5 I extp #p(data2), #1 ; 跳到 data2 页6 A# t5 ~+ n$ U0 w
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
8 e( X; N& ? B callr sub_1 ; 页内调用
9 @8 Y Z6 ~2 u' U m0 B! q/ v movb rl2, #'A' ; 得到 ASCII 码 'A'* K& f$ e7 u. L( E
loop_1:
, o) g9 _+ |: \& A" ] mov r2, #1234h
; y |- k6 K- l1 ]( C& } mov [-r0], r2: ]- P" [: h" P. l, ?7 c0 b
calls memcpy ; 调用段表示的子程序/ y9 u# L9 w) [8 `
add r0, #2& p% M6 \$ P `2 r3 t# T" ?! Y
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处, b* }1 S* k0 T. B( |. k; ]. c
rets
5 [' _( W {- @7 J9 X5 }% K% L! l! a" ^
sub_1:7 {6 B# D( o$ t$ h( f1 ?2 W" N
mov r4, #1234h
; W1 u e! D; X8 I. \) X; H% `7 b/ t ret( \4 b/ f7 g W- T' J% Q( T: `2 t
/ H+ q* k, Y9 I) ^$ Y& Idata2:
3 g; x2 t" o/ o. _ db 'A',10h,'Testing',0 ; 定义 bytes 型数据区6 r5 ^# [ @7 t2 R' S7 E9 ?
9 Z1 ~* U' Y4 x0 p, I7 n, O8 U
end
- |, W$ M' x( y0 G( Y `, J
* Y" Q0 l# X; A' Y;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
. D0 [% Y6 p! B/ M) z) |6 s, j5 m2 R1 P n+ n9 E l, u. W! x8 Q
Allaahu Akbar,/ L) G( h/ x# k9 Y: {1 h6 n
RizaPN <rizapn@yahoo.com>5 x t6 o3 A s2 \ g, l2 g8 t3 W
Jakarta - Indonesia9 @* |. J+ g7 D
' f5 j. q. H) S0 b& j[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|