- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
6 r9 O7 p I, I8 Z% H0 I) W* ?! O- L" {) K
简单帮助:) P' H( w1 |; z. V5 A7 U/ o
====================
) j% h2 U8 v2 b0 L2 Z1 X& P*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
3 ^ D. i) v. v0 W! D0 e6 `" q" Q- }*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.- ?# ^2 {) F A) S7 O) b! ~( J
F6 Y8 F5 @& p! ~* m+ K
9 o5 B2 d6 u9 N1 [ L8 P! h搜索空白区:' f1 w( L# H6 B" h0 U
=====================! W: Y8 S i( l
> sfe 0 ; 帮助& K4 q1 W# y8 }! ]) \+ T3 @
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)' L6 G- b z) l$ [# d" X2 S
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
9 G2 M8 C R" D* l/ k9 ^/ b w1 Y u0 v O5 p7 W
二进制拷贝:! \& p$ X- m4 m F! e- r& j1 t
============' M c2 ]& u) I8 x" a' I: }! q9 z
> sfe b ; 帮助/ ~6 N; S5 ]1 B$ a
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
6 L2 A+ x i3 |$ u5 @+ n> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
I, F& v" ?2 I. t> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
n7 R+ \' n, k" U4 a; n> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200( g" E0 i d- N2 ~
/ `1 q& B3 g5 L& v- W, e比较文件:
! t2 s( |9 d% r% E) c$ H- u8 Y' a==============* W/ k$ s/ d% W, V
> sfe c ; 帮助& I8 h! P$ B2 I* t
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
u% t2 m9 x* E/ w; _6 I> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
( K5 ^: \; v7 y* |> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes0 H2 v3 l( O1 y1 N" i
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )3 J8 d3 E' f! N0 N# \; x
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
( S( u# t( ]* o% }) E. S> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
: E1 q6 z# c# a" F& J9 ?- Z> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
- p5 e Q4 S8 P$ Z* e1 R! _0 i, K8 K: q) P: Y5 H) E
发现16进制的地方:
. S/ H) @$ Z% F& T+ C6 }8 l====================
% R# Z7 E6 N2 V5 m0 X1 E r: K> sfe f ; 帮助
6 ~, i+ \$ Q9 {9 o> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
3 k* b2 D" A9 C/ ]3 R3 U> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
/ S" M: J p" n3 t> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
7 R7 H' u; V# P6 o ^* e> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
( P" L$ m! P$ g, M& F, ^- } B& ]> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
. p. g B2 N# H> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.- m, H# E+ |: X" ^
" ?' I y" ]& J, @1 C
提取语言数据:
) }8 c1 D! B' N. Q' P& B7 m7 {. b======================
0 E/ @4 q2 O _( z> sfe l ; 帮助
1 G% H2 c/ a0 R5 _> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
& [5 W! ~& S; ?, p> sfe l src.bin 200 ; 显示 ID 200 的字符串
: b M6 a2 t. p% L$ K( A> sfe l src.bin 200 2 ; 用第三种语言显示字符串7 |# t. l" e: l- T% S+ {+ P
> sfe l src.bin -1 ; 提取第二种语言0 @9 }9 c( g1 N( v& W
> sfe l src.bin -all ; 提取所有现存语言/ `% [3 _/ y' d
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
- K. Y5 y1 V6 [> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言), o' o1 o" o# r, Z9 N& Q+ @
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
4 m8 d) T ~6 I5 N, h- h0 c2 [> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
* M8 @" w" i0 Y g D! h( T> sfe l test.lng ; 检查test.lng 语言包9 g8 w- @& k$ j$ W9 \
> sfe lc test.lng ; 检查和更正test.lng 语言包0 N* @) H2 P7 c# Y( @$ r
9 [8 D4 k- [3 ]" Z! z f8 O' T
提取菜单:
6 \7 H# d' a* i7 G6 e# D$ ~=============; {1 j( T& U2 J" c# q* W. R! P# q
> sfe m ; 帮助
$ j9 y5 T% c- R/ B+ P9 ]% j5 V> sfe m src.bin ; 提取菜单结构和入口
; m" p( @) V/ Y; z: E
% P6 Z9 V+ W0 h8 |& p
0 ]" w% _/ V) q补丁:
& C. i! b/ H) j$ ]=========' n6 j4 i+ t" G& Z8 n3 W0 e
> sfe p ; 帮助. k& ~3 H" n* k4 ^+ l5 a
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
$ T; h# j6 @' n& b+ r! N5 u5 q7 |> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
) j! b; M! b; H7 Z7 f> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz + R& z! d1 ?( }5 e- ^" ~' W
# w# ]! z( j0 n2 ~8 _4 C
- i% N4 q9 C9 N3 G% J& F# m
编译:+ y# w. j, Y0 o; k- W
==========- U+ p& x+ k/ Z2 r
> sfe a ; 帮助
: O1 m, z W: R8 h# [> sfe a src.asm ; 编译 src.asm6 a' V) F, D( D, y. F
> sfe a src.asm d ; 编译 src.asm, 完整输出
& ^- N; N* B! i> sfe a "mov r12, #1234h" ; 单句编译( V$ C, C) Y v' s7 s7 M
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译7 P9 [8 a$ {7 z& o0 c/ i L6 ] Z
> sfe a src.asm,TST ; src.asm编译成补丁格式, t5 B+ `/ |9 D8 q! s2 g; R
> sfe a src.asm,TST p ; src.asm编译成补丁格式
1 Y7 P# X4 M2 t3 Y- x> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行5 G: S- s# |. c2 X+ V9 T! p
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000008 c# Q5 O7 B% H$ M% Y. \+ Y
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。6 G" O) {0 c, j" w6 J3 G# y
8 G: M5 O( S" j# C9 J/ q6 }& t
*) See Assembler Part to get more 'assembler' function detail
$ d& y2 V- o i& ^: @' @: o% P( ?; g0 u! \- J; M& P
) p& h6 S' q3 d" z反汇编:
! w! z) L4 q# c# h: f. Y% i0 X=============8 @3 R2 G8 L* o
> sfe d ; 帮助
9 f" K; [4 b$ d8 x9 n> sfe d src.bin ; 反汇编 src.bin' R7 r1 L R" R( ?& m+ F
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin, V4 `5 K7 h7 {3 x! |
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
* o( `; K+ g( e$ k! ?> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000- V9 K2 j! R; F9 z+ m, L
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止9 m% Q& t" P8 J- ~
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址) e6 b- w: d6 N) r
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件% G0 j; g! f% I( ]3 H+ K# {; n, N6 Y* c
> sfe d image.bmp ; 单色图形汇编输出
9 u' w, t7 G. m, I> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。3 I7 S3 k9 K( ?9 i: Y
8 |4 _" R. K7 M, a; U4 Z# q" E/ C5 g调试:% J2 }8 L2 H9 ]1 m5 _1 P! Y* u* L
=========8 w/ s' X4 I% f' y; F
> sfe r ; 帮助
% e0 w0 }4 v5 G9 b2 R7 m2 `9 I> sfe r src.bin ; 运行 src.bin
& r: ~ b1 u7 n; [& ~> sfe r src.asm ; 运行 src.asm 汇编文件0 {% O" ^5 q& @4 n0 G5 L% s
> sfe r src.asm ,n ; 同上, 正常输出0 ?; r. Q2 v' S
> sfe r src.bin,200 ; 从 0x200 地址开始运行
+ T. G9 \6 Z2 j( Q> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
/ C9 A u* O$ O1 c> sfe r src.bin b00000 ; 以 B00000 为基址运行
# n! }$ e6 c( I> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行$ E5 }, o# E/ `; ~
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行4 U6 U5 Q8 I0 W# `0 s& H
( Z: W- W* b' D, q" s
+ h. E; d P, ^' e# r交互调试:
( U, C% E! S* w& g======================/ T4 w: ]5 f: `) |" _) ^$ d
> h ; 帮助/ ?) U0 N2 p6 E( b
> g a00000 ; 到地址 a000008 k$ f) D# _) b) b/ U# u: @
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)4 B; p% B N4 \
> d ; dump 内存 (现在地址)
s p3 M }( y( ?" o> d a00000 ; dump a00000 开始的内存
# ]2 B' I1 R! a, o> d a00000 200 ; dump a00000 开始的内存, 大小 0x200. ]' o& ?: f7 p4 S9 Z
> d r ; dump 注册
/ e) g+ ?. G3 V3 x( N6 i; [+ A4 A> a ; 单句汇编; o% y3 _$ T; M. ~! R8 m
> a c7d530 ; 单句汇编地址在 c7d530, o7 h+ X3 z4 W. Y' S P+ a& ~( G2 A
> u ; 显示反汇编
4 |$ v# Z0 [- Q9 \+ ~> u a00020 ; 显示地址 a00020的反汇编7 l: ^& E1 a1 H% ?+ z
> r ; 在现在的地址上执行一条语句
( G0 }. k. T* \' J3 ^> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
% S; l' \) o1 k/ P> r 0 ; 运行到返回语句) {% E u# i0 Y! n+ n
> r -c7d580 ; 运行到地址 c7d580
1 f6 z% ^+ n4 |> q ; 退出6 c9 [3 E3 A' \* K% @! H1 y7 ~7 L
8 f% L; j! T W1 ~& l4 ~4 U
*) 所有未声明的语句都会改变当前地址。. G3 R2 M$ h- x3 P F
4 k6 x5 l" m1 ^+ ^' Y- w" ?5 B
2 z' G+ r; T/ \- B! H: T1 N, r. w特别的助记符:
. K$ I- \2 t* l7 _) F============================5 Y) R6 t" ?+ u' _$ _$ V& B
*) 所有C166的汇编格式: K! q: y+ C( ]8 w
*) 分号用于注释 (在一行的任何地方)# y! L8 I- Z2 }
*) 特别的助记符如下 :
. m R% P6 g0 G5 O* ] #include filename ; 包含文件(各种定义)
8 B: Z- @+ V- n4 N& ]) i #define var value ; 设置替代变量 var = value
. [* b+ E+ A0 N$ R var equ value ; 变量取值 var = value, @% \0 M; t' P2 z% n
db 'X',36h ; 定义 byte(s) 数据区
, j) M) R) v+ ?: F* T* c' ? dw 1234h,0,'AB' ; 定义 word(s) 数据区4 j( U( ?- _4 o8 n8 {) P' }2 w
org ; 设定当前地址, y) M( X0 ]1 B7 d H
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)1 F- t; l3 j/ f6 }/ A
end ; 结束记号4 D+ q$ i" o6 Y6 Z6 ^% Q* d
;#name XXX.string ; 定义补丁名称 (XXX)0 X! W+ I6 S( N6 g
' ; 注释将一起进入补丁
* y0 g! I3 v8 V/ ~) Q- { '' ; 注释将一起进入补丁,加回车 N, |; L* X1 P( G3 X
'; ; 以下内容将全部是注释,直到出现 ''
9 V0 ]3 l2 j/ d8 S ;' ; 注释将一起进入补丁. A0 q& g. V3 _/ S; T- X
+ - * / % ; 加, 减, 乘, 除, 求模 操作; t% @3 s1 R/ D9 l2 E- |4 p) k
>> > < << ; 右移左移操作
: _1 t" d5 B1 w4 s# I7 W; Q5 | & && | || ^ ^^ ; 与, 或, 与非操作; e7 [1 m# M X$ P; o
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
x( c' |( n% j page(value),
8 g* z1 V- v9 \2 U3 n" \- [, ^7 } pag(value),
( N7 {' ]9 K4 F5 Y p(value) ; 页值 (= value / 0x4000)! M2 u% D) f3 }3 }% \% N. r
pof(value),; f( ~) ^/ q W( n6 m
q(value) ; 页偏移值 (= value mod 0x4000)# \) P5 H* F8 o" c+ A
segment(value),$ C' b0 y; j. N0 O: r
seg(value),$ B/ z; D% Y: e) E! P6 j7 J- ]) P
s(value) ; 段值 (= value div 0xFFFF)8 D. o; c2 W( |
offset(value),
2 O7 ^% _1 y4 o7 Z ofs(value),
/ D0 z: C1 W. H: { sof(value),. z7 n4 U0 I2 A) N
o(value) ; 段偏移值 (= value mod 0xFFFF)
! k2 k1 c! d, S T% O6 B# M5 f0 g
4 e9 S" D9 O' ]) {" s% y$ Y*) 例子:
9 k$ u0 \; k! R
7 W$ Y. B1 D3 d. b& d+ [;--- Testing ---
! V: J7 y& y9 J6 V& d& S- z A) V/ B1 s3 Y: S9 o
base 0A00000h ; 自动转换文件地址为 SL45 内存地址* P' G. X/ O0 { b# Q+ x' A5 m
% y# U) {# D& H9 I#ifdef ME45
. ^, P7 S4 B5 q2 q: g k #include me45.inc0 K) Q: V7 U) ~% w X
#else
4 J& G0 I% P: i: E/ D9 k7 S" ? #include sl45.inc
' U# z' U, M( c #define FreeRAM 37h:3600h8 M4 c2 x3 e: {7 C3 ~* M8 `
#define memcpy 0c7b384h: w6 g% O+ c, G9 E( {
#endif
- Q, k" b2 Q( C- C0 Y7 }0 q
! X5 M4 o/ W7 u;#name TST. Test Patch ; 补丁名
3 B) @" |* \; i: `6 q
+ v1 s. T; `* l) [# I: F0 T'Firmware : sl45v563 m: J. B) I/ f: Y$ {! F
'Author : rizapn
# G2 U. r; C* {1 E8 `'Updated : Aug 18, 2004
1 V4 T& O" R( ~- [" O
& V2 o T9 n3 q( Iorg 0c7e000h
& i: T+ n, M8 }7 }8 g/ M% D mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移4 ~- n8 I/ _0 \: ^2 k4 y1 F* w& h) _
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值. n! |% J( M- C; S2 n. ~
extp #p(data2), #1 ; 跳到 data2 页
O' U3 i! P8 ^) S movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)+ Z7 O9 n; f9 ]8 U$ {" \$ _
callr sub_1 ; 页内调用 {* T; m( }. ~0 f
movb rl2, #'A' ; 得到 ASCII 码 'A'
8 ^) t# n2 \0 P Cloop_1:
) i- x5 B% h# ?% R4 C. \ N# O b8 e mov r2, #1234h8 i9 {0 o; q* I5 |5 t, a
mov [-r0], r21 Y, V+ q" T6 y7 @% u1 B; V8 M
calls memcpy ; 调用段表示的子程序. q& r! N& w/ i' ~% x1 p$ K
add r0, #2/ y) r0 V+ u, m* _
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处, U$ a! ]% F B1 u4 q* l4 {
rets
4 X0 w& l+ l5 i3 K( N6 B. e4 V" F h. u1 g4 S7 V$ s7 S
sub_1:. c7 n; _) i& s3 J* R; _( k
mov r4, #1234h2 z, O) _/ [ e5 J; s) G _
ret
- J( E( u9 f6 v6 |, Y$ B2 _* w8 N9 r4 R# w) s/ Z9 X" O
data2:
1 U; ]' X8 T; R; s. g" F: z7 P db 'A',10h,'Testing',0 ; 定义 bytes 型数据区( X. H5 e/ J. ~# [
, H. m( Y: [( I. f
end! g/ M. D8 {0 j J
8 y7 L: @# C5 Z A8 ^. A& I;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; \! R* I4 q+ n( K& p8 `- J+ X. |
, `7 u6 k4 a; w' TAllaahu Akbar,( @4 ^7 i8 |% h
RizaPN <rizapn@yahoo.com> F3 x: w/ k% N7 f
Jakarta - Indonesia
2 u& Y8 u9 ?' t2 C p4 H0 m
; d# ]0 A. ^* O[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|