- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
5 y0 e1 n0 U. Q. z: r% s, L! U( b( V4 }% d
简单帮助:. l2 f. Z8 `2 F, u D, B3 A
====================/ R, z/ m* [. L
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。6 L; |5 |% a- H& `1 p6 ?: v4 c0 F
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
2 G5 \! G( g6 a& c; H* w! ` m0 C( ~* |2 K7 p
# k- H1 ^* J. l, o4 n& J
搜索空白区:
% }; Y3 p* k4 b5 p2 w=====================) k8 N' P: s9 I: p: N
> sfe 0 ; 帮助8 X" t$ F# h& b0 ~# S5 e
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
9 a, b! ^% v+ A> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间 C; w* w* x5 X$ x$ m! \0 J
, I+ ?+ F2 D3 U% A
二进制拷贝:
2 N" j: S; b( D============
0 T/ g+ Q: H( @+ a! ?8 I> sfe b ; 帮助
: y1 M/ h6 x) f9 K k> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin3 a( X' b ^; c$ I; d
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
% W$ B' y9 r7 q4 O> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
\; e* L+ ^6 G4 P$ l4 T! Z> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200 ^1 g6 i2 ?) H& M& Z9 [8 w
1 G9 e R. \8 E
比较文件:
y) Y- J8 C @# c% t2 [==============
: i1 E$ { S) _' b( b9 a: Y4 ~. n0 S2 x> sfe c ; 帮助5 {9 c4 B3 A2 j% D P
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin" v9 f9 Y+ K! o
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )3 M1 h$ Q5 b, p9 U
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes+ W+ a3 }5 p; f4 N8 Y% ]
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 ): ^0 k& L8 U; D# a, E
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
# y7 d' J6 P: h3 s' Z: @> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes& R' y7 {) {) H4 B4 l3 L& M
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处): _" d( ?1 ?! s& h
1 [, Q1 |* P- Z/ |7 p* a; P发现16进制的地方:6 D( X7 s4 ]4 ?3 b0 |% x7 I) V
====================2 K* R% i1 @$ O' t& \3 w) x
> sfe f ; 帮助
1 g- T5 h, B: c/ f/ f5 O1 t! B> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
_4 ]8 T( S& Z; w( z- X: {> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
- {4 H/ B8 z- J* [' G6 T> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes& n5 l+ I# L' I9 K. P
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找. c( S& L, y% B4 y
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小0 q j$ `5 W/ L7 V+ C
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.8 J0 s6 r; E; k) b9 D) F
) ~* Y3 h7 A4 ~# l/ x: y) D提取语言数据:7 O# w' y& V8 L7 A7 q1 r* ^
======================; [6 {; Z. C7 u8 k( o
> sfe l ; 帮助
& K4 A; t6 Z& [" z> sfe l src.bin ; 提取第一种语言,包括扩展文本数据# W2 o. L8 ~9 Y' d G& v
> sfe l src.bin 200 ; 显示 ID 200 的字符串* L9 k; T3 a: G0 g
> sfe l src.bin 200 2 ; 用第三种语言显示字符串
/ m9 `( q$ Z/ p: D> sfe l src.bin -1 ; 提取第二种语言
4 Q& {) m9 |7 y: k$ p> sfe l src.bin -all ; 提取所有现存语言) p% U7 Y7 _( }2 g
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串% ^1 \9 Y: d7 A/ K4 q4 p) O5 e8 z
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
0 {" Z+ e( [& a/ f2 J: v+ Z> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本2 f U" S# D( y% S, W% Y$ @
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 - v3 S0 s+ n" U) ]8 z
> sfe l test.lng ; 检查test.lng 语言包, p, e$ h+ a5 U9 P
> sfe lc test.lng ; 检查和更正test.lng 语言包
; I ?. e# e& G, W# _$ \% `7 l0 y) A' q8 o/ M
提取菜单:2 x% ?) c8 _$ ?- D6 C$ K
=============
- [& v; s6 R* o9 G; \, \" J# [> sfe m ; 帮助
/ ?& T! [# B1 D* ?> sfe m src.bin ; 提取菜单结构和入口6 n7 ]+ W/ v$ I$ G1 h- j" E" e
2 C3 K# Y" M5 [% }
; P) C$ \* ~7 [
补丁:$ o+ _ ?. v6 j$ k8 A4 s; P
=========3 i* y# b& Z/ q& m( r
> sfe p ; 帮助) {7 I7 Y; Q) L
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
0 G) i8 L8 d/ a/ @ c* b/ f> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz/ e& L) j1 V) H) }* g
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
( J# I0 L: w- F8 c5 y
) B" P, a: V: ~- i0 M) ~, o
- D* L) b% J3 X; V- w编译:
. U% h2 X# T+ ], M' N==========& ~7 W% ~. G3 T) G: G5 }6 X
> sfe a ; 帮助
% f! c5 x$ X* ^1 P& X> sfe a src.asm ; 编译 src.asm5 {% ]" k: G0 E* H$ z6 f, Y3 s( N; D
> sfe a src.asm d ; 编译 src.asm, 完整输出
4 K$ N5 y7 D$ b; U8 Y$ v4 H' |> sfe a "mov r12, #1234h" ; 单句编译
% ?# M9 z0 L$ U> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译1 c' w" q! m4 b" T) A
> sfe a src.asm,TST ; src.asm编译成补丁格式
- ~3 F2 O& [$ ]" g5 k> sfe a src.asm,TST p ; src.asm编译成补丁格式1 \" r2 @1 Q) q4 ^; U w
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
2 l; H5 f7 D% ^8 j1 g6 p> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000009 Y' G$ b9 T2 V
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
" Z0 _/ k9 o* e- y# V, L+ f4 Q, B1 A; N4 F- w$ j: i2 m, H
*) See Assembler Part to get more 'assembler' function detail- s6 B( r, M/ u4 Y" Q$ a, X
0 \/ c8 `9 Z* u d/ q/ `9 w8 j2 ]8 d4 a
反汇编:
. _. [5 k t; y8 {% E, F% ?=============4 k, v7 X1 Y) z6 J
> sfe d ; 帮助
5 q, ^! f, P1 q/ a2 P4 {> sfe d src.bin ; 反汇编 src.bin* G4 o' U4 S# C6 [1 u) u/ F0 p
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin3 u4 _) }% T$ n |6 B; b& _7 `+ L
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
3 K) z; W) I; C, L/ x> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000% d3 @/ p+ ^1 E9 l1 Y9 a
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
2 d8 }7 |. R7 x5 X* F) |> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址 D" Y: s% N# k9 ?; l) x+ s
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
/ z+ O( A) {- q$ V> sfe d image.bmp ; 单色图形汇编输出
4 A. V0 X& t6 e, o7 i% n/ t+ ?8 M> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
% e7 l, [* a6 l7 z) g7 c9 W$ y/ K4 ~* X9 {8 b8 D
调试:
) n4 T( f V/ O& \/ H=========
; m9 I, S% g+ l- c5 Z7 p0 _> sfe r ; 帮助, O, B2 Q' _& A& o4 F* U
> sfe r src.bin ; 运行 src.bin
* R$ c$ a/ T$ u* W% q+ V> sfe r src.asm ; 运行 src.asm 汇编文件/ q5 m1 l7 R( C2 v" ^
> sfe r src.asm ,n ; 同上, 正常输出( w; v L6 V. {3 D% q( y
> sfe r src.bin,200 ; 从 0x200 地址开始运行
- V" Z9 k b- C" D V z> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200! m9 Y: ^% H( c" j; e
> sfe r src.bin b00000 ; 以 B00000 为基址运行
4 B' d2 u' R6 P1 M* [3 N> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行' }7 }7 h3 f( q0 Z
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
6 P7 q8 Y: Y1 k& c7 R$ G: \" y, ^6 Q! E8 q& P$ s& _* v
' a$ {3 O- H$ L ~; s& m$ l* p( Z4 V1 D交互调试:5 t6 B: j; P; M: S5 r/ R, t
======================
, z, ?# }3 s4 K. O> h ; 帮助
9 m: L/ g* m; \- |> g a00000 ; 到地址 a000002 H7 b2 Z8 @' ?4 M/ L
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
1 o# l" w3 @) A& I1 T% \> d ; dump 内存 (现在地址)! F6 \ S) B- k8 I
> d a00000 ; dump a00000 开始的内存; k% [' `7 ^4 E
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
4 _1 t$ W! B) P> d r ; dump 注册
0 z5 ^& j8 I; `7 |( v: h; E> a ; 单句汇编
6 E; ?! ]; M8 T; a$ g> a c7d530 ; 单句汇编地址在 c7d530
- ^- e% Z0 l# r$ m: |) {> u ; 显示反汇编
5 q7 F( o" W( G1 u9 }> u a00020 ; 显示地址 a00020的反汇编
6 b/ x. m, I& a! | f- Y> r ; 在现在的地址上执行一条语句/ a, i: P6 i' ^5 _, D* |
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
8 A3 G( k) W$ g2 S( Z( ], b8 A> r 0 ; 运行到返回语句
4 f4 e1 b. m# M: f. _1 q& W! H> r -c7d580 ; 运行到地址 c7d580+ J4 O- D9 w1 b# W: W7 z" _" K8 ^
> q ; 退出
; ~+ J. @ V: N6 g
6 Y% [( T9 Z0 t$ A0 M3 k& q3 E*) 所有未声明的语句都会改变当前地址。4 m8 ^5 C- }( D" Y$ [0 r4 c, o
p, r; Z) h& R9 a$ N, T
/ y% G3 s0 n, `0 |# ]* R h S特别的助记符:
& x8 Q, U) q/ p! B7 h7 p6 {============================; e7 o' y4 i& V) l6 z& O$ W8 E" V
*) 所有C166的汇编格式
2 H J4 R# N7 c7 w7 H/ y3 M! k*) 分号用于注释 (在一行的任何地方)1 @; p* i- [% b) y
*) 特别的助记符如下 :
+ x0 M) i) b/ t# I: g #include filename ; 包含文件(各种定义)1 c3 V! _' L$ ? I o, o
#define var value ; 设置替代变量 var = value
$ I8 k" B2 e! T' C! @' P/ ?8 i var equ value ; 变量取值 var = value
; ]5 `" @+ T3 c) U2 U6 X, p2 d db 'X',36h ; 定义 byte(s) 数据区
6 w4 s' T. G" h- k$ y. h dw 1234h,0,'AB' ; 定义 word(s) 数据区
( F+ Z6 t9 ~5 E) D z" p3 G* o. I. `! b org ; 设定当前地址
! j6 Z7 p& Z' }7 [1 x base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
2 D; R) d+ o2 e% E; J( \- k end ; 结束记号' F8 X4 M% c% Y" P) v- e
;#name XXX.string ; 定义补丁名称 (XXX)
6 b. L+ |3 [" R' U4 i2 k1 j3 ` ' ; 注释将一起进入补丁, d8 G( P+ L7 r4 b
'' ; 注释将一起进入补丁,加回车2 O" y& z" @# B$ [5 _% B) t- S* t" P
'; ; 以下内容将全部是注释,直到出现 ''
' S( B! B" I! c* y; h8 M- E ;' ; 注释将一起进入补丁0 U/ o1 s! O! e c: M2 ~; G
+ - * / % ; 加, 减, 乘, 除, 求模 操作
C4 j L& [$ p* L* ]1 o# ~ >> > < << ; 右移左移操作$ s" ]$ `& @( p! O+ @
& && | || ^ ^^ ; 与, 或, 与非操作
' f4 G# T6 L3 v; t) r/ Q. x val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)) v$ I: N- [9 z/ D
page(value), / b4 K" w* C* ]
pag(value),
4 q0 P: t' _# k+ U p(value) ; 页值 (= value / 0x4000)/ s' f' |" ?4 x
pof(value),
9 S9 k* i8 j* d5 [4 w$ L. ^ q(value) ; 页偏移值 (= value mod 0x4000)
7 _% ~( k; o/ |. @! I segment(value),7 ~3 W) w5 x3 g+ h& z. `; b1 t; L: ~
seg(value),
, b y: j* j! b+ |' k) @ s(value) ; 段值 (= value div 0xFFFF)
2 R1 u- _) w+ v3 o. I offset(value),% U: f" C6 l# x" \+ W- \
ofs(value),) ~8 u: Q0 a( {4 D' Y. J; J4 u
sof(value),+ h: U; d1 l6 X3 u6 N( T
o(value) ; 段偏移值 (= value mod 0xFFFF)- `6 w$ h# F# D. y+ d7 b$ ~
1 c' ~* L/ u5 _. |1 z
*) 例子:& q& ]% \- O/ e, o. o# B# f
, r- F. k5 K# o0 i9 Q! o3 B;--- Testing ---
1 q, G& I3 i3 _, g. R& D
: a. b2 N; h: {base 0A00000h ; 自动转换文件地址为 SL45 内存地址2 K3 o' v7 ~2 F& I/ U' ?$ M
1 I' ^5 @1 ^% X5 H( ~2 t+ w#ifdef ME45
% g( L8 b& g6 z) w7 { #include me45.inc% O1 M3 z+ q6 D8 y; I
#else
6 h' B6 K: E) ^1 l9 ]' S' K. a6 {) w #include sl45.inc* \6 H. V3 I5 a, O) p
#define FreeRAM 37h:3600h! A5 o3 Q& X: _( K/ A I$ h
#define memcpy 0c7b384h- U( \1 m" c. d0 O9 W! E4 k4 k5 ~
#endif6 M$ _5 }8 E$ V
, t( e; y$ O0 q2 ?;#name TST. Test Patch ; 补丁名
* p8 K8 n! A) P' m3 t9 g
2 D' I+ h6 }7 _'Firmware : sl45v56* y. V* s2 y ?) n4 v
'Author : rizapn) L( k& a+ j! \% i: p
'Updated : Aug 18, 2004! U4 j8 l3 w0 q, W# M. M
' _, a6 t3 y$ y; eorg 0c7e000h3 C! G' G& u; f/ z0 \3 M* u+ U" B
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移: y! |9 r9 V E: ~
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值/ F3 I- j" n+ o
extp #p(data2), #1 ; 跳到 data2 页+ ~4 P4 D/ O" ]& d" r
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)( Y. \2 H% u, |
callr sub_1 ; 页内调用: m" r w( X9 W3 l; _$ A H
movb rl2, #'A' ; 得到 ASCII 码 'A'
: Z7 [4 T8 Z! d5 |. b( `loop_1:
. ~; S7 Z7 a. |/ M# y mov r2, #1234h/ k8 X. \+ }: N
mov [-r0], r2
9 f# M, M0 Y, ] calls memcpy ; 调用段表示的子程序
& _" l/ o1 u8 Y q add r0, #2( e% M" B- [# H; O
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处2 l+ i1 y- w. S" m
rets
9 L1 d7 S2 T: Z5 X) F$ F P; F8 P2 K" h. V
sub_1:
4 H0 x1 K! `1 ?- T; I mov r4, #1234h: x8 J) V7 c( I1 ~
ret6 [; |% m. r9 W; O8 k, I5 ^
2 I/ Q# L3 J" M; @3 p9 X( V) u
data2:4 B1 ^ j2 } q% q5 R
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
3 S; l' B% |+ a' R
0 M6 j1 k! `7 p8 v' r( M8 _2 |$ fend0 `% @& s1 A/ ]2 ?" T
" g+ J. k' t% k W( D* _;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- W4 @& n0 N% D$ ~7 h5 [
5 _5 N* B8 ~0 L# W+ U; ^Allaahu Akbar,$ e6 {6 i) f; f# ~* d! O. P# a
RizaPN <rizapn@yahoo.com>) C, g0 L L8 x' i
Jakarta - Indonesia1 X# ~( w" p6 N0 g2 Z8 P" N+ d
- C7 J7 {+ d* |! {5 d
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|