- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
) o( z8 L( G2 |1 o
" M9 p( U' v0 i: N7 S! J简单帮助:
+ F1 r- r1 }) ^8 |) `====================
! ]' ]: u6 E% R( H2 Q6 {*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。2 O) N G0 W% l6 j/ K) g+ B
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
# n( c- F/ V2 k3 m7 H" w/ H& a2 e0 k. `& g4 R( M# Z- j" O
! O' m+ P, s8 @ V
搜索空白区:
) H# b# q/ M$ _% T, {- g7 K) R9 j=====================' K1 {# a% Y" [* Z: \* X. K" M0 V
> sfe 0 ; 帮助: m# ~" F4 P/ V6 W$ x8 _
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
7 u5 Z9 }0 w* j3 q> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间9 h: o4 B7 C$ `& w7 V
/ S( V" ~" u8 r) X2 s
二进制拷贝:( c; {- B" u+ B
============7 N9 u$ L! I1 E8 {! A+ w- K& Q
> sfe b ; 帮助3 f2 a& ^' L0 c( e; h* Z
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
0 }8 q8 I& x5 P* b> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
! R n# m0 ]+ U, ]+ ?/ c) v, u> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
8 J9 |1 F! `( s) I; E> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
' j- V2 L8 a. x6 o/ q
1 Y8 l! s2 T: ]- O! p比较文件:1 M% p: R! M+ I+ U
==============- D+ x: W6 I. y6 Z3 q+ f1 @+ }
> sfe c ; 帮助" U) u) l/ k7 n2 C8 N5 f1 M. k+ F# M
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
& n& [& g. n g> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )2 Y8 ?& j, B* F& f# G; }" n
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes2 r) T1 ~9 P; k* J) d
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
/ f" ~7 W. R, M7 J, L- U7 m& K3 b> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
6 A# I/ l5 F) p0 a> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
) Q1 @* r, a! z3 F> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
! L8 V/ }+ [* I) ?, L) W9 C {0 }. w a$ b- c
发现16进制的地方:
0 o; r* |6 N2 _& Y1 B====================
4 E- q, L# q& Z! K> sfe f ; 帮助5 I4 p$ W5 h+ f' d6 f
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
8 a" q8 J' }" b8 J- V6 x3 T4 t7 H> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
0 s2 h( d( _: o1 E+ r> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes5 z; D) T h% X: T
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
) F4 a& j$ g7 |3 S> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小6 K9 [: d/ R8 N$ a3 C* q" }- \
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.# h9 M6 @& u9 f+ D- C6 m( [! t
7 e$ V9 X9 [; N2 g s, H: W
提取语言数据:
$ m# @4 ~4 L' c4 J+ x======================( x/ a9 ~" f! \' B$ ^
> sfe l ; 帮助% k9 L' z& c1 d$ s; Z: M3 C% o
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
7 l& U+ K! B3 X }) T* v> sfe l src.bin 200 ; 显示 ID 200 的字符串6 ^2 d; Z" D, c* N8 j
> sfe l src.bin 200 2 ; 用第三种语言显示字符串' S3 y% s" K8 \4 I1 W; U7 i
> sfe l src.bin -1 ; 提取第二种语言
; G1 F1 Y/ k0 j; c2 b6 I$ ?> sfe l src.bin -all ; 提取所有现存语言
7 v4 D1 y1 r9 h! M9 V' s0 U. V& ?> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
* K. ]- C1 o5 ?% ~$ y) R> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
' {# K" n( R) h> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本- j! y- C2 h$ F
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 f) a! A3 x: A) @5 _0 @! q- `& l
> sfe l test.lng ; 检查test.lng 语言包
- b6 f) ^, o! F! Q; }; s1 Z> sfe lc test.lng ; 检查和更正test.lng 语言包% x- [$ L! \0 j: ]
7 ?3 A; z4 T; c4 o提取菜单:9 F* z% @! r9 P# [
=============* n, _; T" e6 M: v* R( @5 h) I; p
> sfe m ; 帮助
# v% _9 ]- t: F5 U t& m# j> sfe m src.bin ; 提取菜单结构和入口$ v7 @% t8 R4 T6 C% G" K- r7 ~
1 N1 g3 S7 k) O7 ~
8 j7 y5 H, u2 [. F! P0 @
补丁:
% J# y+ ?* w; ^. T' w" T=========
1 x* I! U/ v/ L6 `* j> sfe p ; 帮助1 W9 a- ?' Q: R+ }0 ^! |; O% u
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin/ j4 z, S' }: k0 g! o7 ^ Q
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
- ^6 e4 w! r& h6 L5 K- t> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz ! ^2 k0 M8 X$ G" f) G, y# ]. |5 x
* p3 \4 J3 i. {! J( ~6 r7 \" M
s' t8 ~. X2 S编译:2 f. T' y# L; ]2 |
==========
& |7 i: q1 ?; b/ u> sfe a ; 帮助, D' q% M. D9 C
> sfe a src.asm ; 编译 src.asm; W" M$ f# x Z$ l" S. w) N
> sfe a src.asm d ; 编译 src.asm, 完整输出* l. Q g' w0 t: h# b b
> sfe a "mov r12, #1234h" ; 单句编译5 H) q+ Y3 A9 u9 o6 m2 d" y
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
, y. s/ C- q* v! _> sfe a src.asm,TST ; src.asm编译成补丁格式 N# x" `+ a t$ ?, J/ o1 x- x4 F
> sfe a src.asm,TST p ; src.asm编译成补丁格式
2 c# I0 |9 ^& d' E; `> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行# w! [3 g2 I8 G3 c* V$ c
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000) _+ E- |6 c3 q" V i8 \
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。) V8 e6 |5 ]' C' a: J- I6 T5 ^! a* F
' \) G3 w8 }+ L3 a0 ?
*) See Assembler Part to get more 'assembler' function detail
' m' k" F; s2 G8 J# }0 G: U
! [1 |: F0 C( Y3 h
! U u/ V$ [/ c% t+ ]& X反汇编:
& }' E, R$ l2 _ V2 R) ` O; \=============5 o/ M3 \# e$ H* L" l$ X
> sfe d ; 帮助2 T- a- d9 m) V- A
> sfe d src.bin ; 反汇编 src.bin n {8 H0 u8 M. |# g8 Y
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin3 z2 z% Y# m- X; ]
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节& n) ?, A$ K3 V8 ^) G/ D
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000; P y, _& i! D6 {$ {1 G, r5 _
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止- J- h V0 U3 \6 z8 {& [
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
; n, D8 R a: y) Q; B0 u0 P> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件5 @- _( b- H# T: w o( {1 H
> sfe d image.bmp ; 单色图形汇编输出# m* V# i' |% l! T4 O/ _( W
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。3 P5 W {# V7 H
2 Z+ l. H% U2 v/ r% X) M6 u$ _
调试:* q' t6 P- O: K0 C# b( e6 ? u. E
=========9 A7 Q+ |# r3 Z) @% O! b
> sfe r ; 帮助% q! d+ G4 N# s l$ x% Z. t: B
> sfe r src.bin ; 运行 src.bin C, W& M3 X# l4 i7 D
> sfe r src.asm ; 运行 src.asm 汇编文件9 u8 |5 q' M. L8 D5 d4 K1 M/ d% x
> sfe r src.asm ,n ; 同上, 正常输出
& M' X* e8 {# J- q" e> sfe r src.bin,200 ; 从 0x200 地址开始运行. L+ ` ?/ B+ ]& r8 A$ d) Z# f$ _
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
: q Z/ k" z5 M2 q7 m) U> sfe r src.bin b00000 ; 以 B00000 为基址运行
1 r$ R& e2 o) b. _5 ]9 W> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
6 c6 a# G7 P7 [3 E) O) c> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
" f! I X6 `! l2 N1 z# N4 \1 Q( {) ~5 J" d0 L$ A, j: w5 W
2 P! b e9 {6 |6 n交互调试:
: M! Y7 Y c2 P4 ^; @2 o======================* o7 [# I1 s5 \& ^. G" a. P
> h ; 帮助5 w9 _- ?: V2 \4 [$ Z, x9 e2 \0 C. ?. L
> g a00000 ; 到地址 a00000
& Z$ G# y z7 C8 S `> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)* M3 {& h, e+ B, y
> d ; dump 内存 (现在地址)
, N) E; U5 {7 B9 |# D' q2 \2 w/ W> d a00000 ; dump a00000 开始的内存* d8 f8 D& E9 r9 j/ d: l' a9 F
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
9 ]- e8 O3 p8 |" S& Y> d r ; dump 注册
$ P" b5 U0 b7 M. f* B> a ; 单句汇编
b1 |+ v8 [. B! c* \' ]> a c7d530 ; 单句汇编地址在 c7d530
$ ]+ i7 I3 i! D2 y# s* E/ H> u ; 显示反汇编9 V+ v x6 I' x! m* u8 {/ z2 O" C8 F
> u a00020 ; 显示地址 a00020的反汇编
: g. y1 Y, M) s# r% @> r ; 在现在的地址上执行一条语句0 p! ~1 G& @) J7 N/ ~ q4 X2 d
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
4 K7 s: W4 s- P. j' j) I5 j> r 0 ; 运行到返回语句
6 @( w( f7 h# L S b> r -c7d580 ; 运行到地址 c7d5800 t9 w4 e) g% a( R6 O$ Y: T& s, B
> q ; 退出) O4 V( H7 A: l# Q9 q$ v
( {: j* {6 \' I' c9 M
*) 所有未声明的语句都会改变当前地址。
" I S, z8 `( E
* y7 N4 c$ `( I6 H; U
9 Y" R( m& |+ ?特别的助记符:0 ]* g( h9 j; T& K
============================
% D; ^/ l% g# J# ?( M) X. U) I*) 所有C166的汇编格式- O/ a* b1 `5 P4 O* k
*) 分号用于注释 (在一行的任何地方), }, ~4 d2 \9 ^& q0 U" c& D
*) 特别的助记符如下 :
g8 r. B" n% O0 D #include filename ; 包含文件(各种定义)
8 \ W5 Y+ T u #define var value ; 设置替代变量 var = value
, d+ Y" ]( O& s4 C var equ value ; 变量取值 var = value& q4 _( q- H6 g6 X! ^1 C
db 'X',36h ; 定义 byte(s) 数据区
8 j8 z; ]4 V# k$ a dw 1234h,0,'AB' ; 定义 word(s) 数据区
0 w4 E5 e& x4 M, D" T8 Z- t# u% [ org ; 设定当前地址
0 G: B8 N3 M6 q* J base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址) D! U9 `# d) d
end ; 结束记号
- s+ \3 S3 L5 s. z0 ?9 z2 Y. x. F ;#name XXX.string ; 定义补丁名称 (XXX)
5 B# c c% q- ^9 }0 }, | ' ; 注释将一起进入补丁
- g# m" s5 n! N '' ; 注释将一起进入补丁,加回车* D' E$ i p) ?
'; ; 以下内容将全部是注释,直到出现 ''
4 d7 v, O: {; w% L ;' ; 注释将一起进入补丁8 K, r# W) K6 V' Q! q2 ^
+ - * / % ; 加, 减, 乘, 除, 求模 操作
4 o. ~0 O; m+ B( v >> > < << ; 右移左移操作# _! _# P! s6 x
& && | || ^ ^^ ; 与, 或, 与非操作
8 u" {# O" v' v9 Z) E& u. d val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
/ U7 T, l+ p4 d% _& E4 K! M page(value), D/ {8 F& w& O
pag(value),
1 B0 Z9 g L1 j" C. n$ S p(value) ; 页值 (= value / 0x4000)% _0 O8 K9 [# x% `7 H4 A" x
pof(value),. Z$ a. j; A3 a" v% d2 E
q(value) ; 页偏移值 (= value mod 0x4000)
9 k* q4 V& f( u% `) M$ c% U segment(value),. u# f% F; P. \% _/ b$ t3 |
seg(value),
, k1 H" ^5 [7 u4 I. C7 {& d s(value) ; 段值 (= value div 0xFFFF)8 n$ a# }' p! n5 |4 e
offset(value),
) D- Q% z/ v* R' M; n4 Q ofs(value),* Z* r& N( F; I3 z8 C s+ n
sof(value),
9 j1 w, E1 Z. Q; }7 I( d9 i+ h o(value) ; 段偏移值 (= value mod 0xFFFF)
; w( q0 o1 P7 x4 a7 Z) V
3 i: w, `; a! o*) 例子:1 s' I: g; Z6 ~; h m ~# D: P0 ?
- K) v3 Y% I/ O1 b, ~
;--- Testing ---
" Q: ~: |- f$ x7 Q9 L( `) Q# M8 R. J) Q- ^
base 0A00000h ; 自动转换文件地址为 SL45 内存地址
8 ]4 y1 u; F x. Y' M
- \/ r9 G6 }0 @, o, G/ C2 y9 f( P#ifdef ME454 g8 y; |& n x; W/ p5 q0 \
#include me45.inc
5 P, ~5 N( `: B, K' {#else0 {: T8 L( `* f4 N2 |& h7 r
#include sl45.inc
* f. F5 l' j% w" {( g #define FreeRAM 37h:3600h* u% c2 B% p7 a/ z' ~
#define memcpy 0c7b384h* h y" w. N8 C! H6 t5 t3 I7 v
#endif( u+ p: Q" m* r1 j$ A
, D. {( j4 N5 N7 e( Z
;#name TST. Test Patch ; 补丁名
& I, _9 t& a4 O: k( O
: y0 I4 W/ q ]'Firmware : sl45v56
& e2 @( \0 ^# B8 i* Z'Author : rizapn+ m3 b6 {! \8 i
'Updated : Aug 18, 2004; R4 L( U4 p. j- S1 P" w1 Z4 g
& H6 v" j7 }: r. m- l k/ l" y1 [
org 0c7e000h
4 G+ M7 |$ \( a& O% |9 n# Q" g2 x mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移. Q! q1 m/ \6 @4 Z4 {: H0 G! I: u
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
* N1 y: [1 @8 [; j0 x1 w extp #p(data2), #1 ; 跳到 data2 页' D$ l) Z1 Z+ [
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
2 j$ ^/ H0 I! M/ h3 W callr sub_1 ; 页内调用- M; n; N9 b+ }0 y& H8 G' G+ d
movb rl2, #'A' ; 得到 ASCII 码 'A'
, v8 |7 O: }1 ~3 O$ H% i6 ^loop_1:
( G+ d$ e( X; E/ n5 ?2 a3 { mov r2, #1234h
& I* W3 |* o( q( f1 M mov [-r0], r2
/ T, C, |' a8 G) [4 V8 X calls memcpy ; 调用段表示的子程序1 z7 G3 b0 Y# ^2 P
add r0, #2
0 S- |9 E8 V1 m! \2 D: k# Q jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处3 G) M2 I( J! I2 z! H* v
rets W9 Q2 i7 a& k$ n
" Z* Q# B7 t' t
sub_1:
0 q1 z K: e% x mov r4, #1234h
- F% V; I! v. a. ^8 \% b, p ret
) ^ o# C8 z) E3 S8 O' @9 I' `! w& o% a" t! b
data2:' o2 \1 @0 U5 a, `
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
7 i( |( R& |" ~3 P* Z8 H0 a; ?: [( }: L0 U+ C- b
end
& I3 o! l7 M6 I0 H8 H0 \( d' W) X- q7 p. @! [. }
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
$ Y f, c. r+ A1 T/ W
; g! B; t. i' ^3 w* z+ d/ M( }. bAllaahu Akbar,+ C }* Z: S$ W- A: D' v
RizaPN <rizapn@yahoo.com>
) q# R) F- x+ y ?6 l" wJakarta - Indonesia
4 P, Z5 @" x7 E$ s9 q8 t* E% W3 @9 D7 N+ }
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|