- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:) T7 {' y4 A0 n: F9 }) j# t4 c
# @0 t# \9 R" f. z" Z+ a& n" Z简单帮助:; e, b0 L* |% W9 o8 I3 g
====================
8 n9 E: h6 F# f5 P% e5 ~& Q*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
2 y* ]7 [: f7 S, g6 J*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
5 b1 x4 l/ W* o1 @! \: ]( S7 e
+ l) B) F( r, H1 H2 k5 d. Y: Q7 d! P: A7 y4 h
搜索空白区:
6 A8 o+ K) w8 z {=====================
5 R/ @* R, m0 u6 b m> sfe 0 ; 帮助
" [ D5 k" m3 i9 E> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
9 Y: H. A z0 a" y: j0 p" \> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
' N; E7 |. ^, a- @/ @/ p( _/ m0 i2 q* X+ w
二进制拷贝:
# A- K( g! A2 `- I; L============
# u& N" P. d0 K, o4 a> sfe b ; 帮助/ L6 Q; |( h) d$ I
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin3 n. ?* v, @7 m5 G/ B+ h v
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
8 h: L2 K2 z4 @2 t> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
' Z: s1 n4 Q+ Q0 L6 u/ }: c' ]> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
$ a5 Z1 p: D4 m i! H: ~/ s F' n3 N. o( Y/ c1 x% y
比较文件:/ F6 }4 L, F. w6 f: Y
==============
, I6 k. @- P+ T8 c# Y k8 ]> sfe c ; 帮助# }' c+ _1 l4 z# E; I) W- Z7 i
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
0 K1 `" T( _- z+ I2 u* l9 D> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )' o; j; m2 m( I4 [: z8 ~1 ~
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
3 k- g2 j* J+ E, d5 j8 r> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
1 x: g% `* Q& V" @1 g d> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000! V7 ^" `/ R, X& [9 T- I0 t
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
! `- R& t4 v* Z4 T0 W> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
: O) _) `+ w" x/ t
1 H. J) _9 z+ z) g发现16进制的地方:
) U9 x3 m! s8 G; S: k7 y====================
; ?% {6 S, m1 B, F) V) n6 b$ `> sfe f ; 帮助8 I/ M5 ~) i; Y0 _
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个1 n/ B4 G9 l: y: n" g+ T" I0 `* m
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找6 r" r" G. s! h2 A
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes( @+ ?* O' i' \0 @; c9 S1 d
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
4 x' ]1 S4 z, k8 t+ ~# _: }) }> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
1 K0 |/ K" r9 d# L% S7 x% p5 Z! ^) E> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.' Q( u0 N5 s$ D A% k
1 D9 m+ l. g9 {) U1 D4 m: y
提取语言数据:$ P" m4 f9 T$ ?! T3 x
======================9 s8 j/ ?$ @% v# N+ q' `6 E
> sfe l ; 帮助- E1 J2 p J. o V7 }
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据3 O0 q2 Y. [4 ]& ^; |3 }
> sfe l src.bin 200 ; 显示 ID 200 的字符串' P; L1 i/ e$ {
> sfe l src.bin 200 2 ; 用第三种语言显示字符串* b$ a, F* \8 N, ^) ~6 f, j
> sfe l src.bin -1 ; 提取第二种语言4 e4 w4 w+ E$ i' F6 \/ {' l9 f* W5 \) ~
> sfe l src.bin -all ; 提取所有现存语言% H! ^% ^2 p6 t1 c
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串5 F* s2 {6 j6 H& _! {. Y$ Y8 t
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)# h1 r+ e8 s0 ?- k2 q) [
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本- R. q* p) U% P! J" h4 Z/ l4 H
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
2 B8 U9 r% Z' \% t, k> sfe l test.lng ; 检查test.lng 语言包
* I# S: F" ?" B* L. f> sfe lc test.lng ; 检查和更正test.lng 语言包' e9 b3 x, s; i) O2 N" p1 z
, _( _$ Z2 a( H1 o提取菜单:
( F# b) e5 e% A" S8 B0 z=============+ _9 T7 s" j$ v# W7 O
> sfe m ; 帮助& T C3 S* h) r
> sfe m src.bin ; 提取菜单结构和入口/ E7 G: K1 ^4 J% A9 \; b' c8 W4 n
/ v; y* f/ W8 P# r" Y
* R- U4 d o& ~- W3 Y( C( f补丁:8 S6 B/ P- ~, @ B
=========
2 v$ R0 Q& p7 ?; s6 A' E) M> sfe p ; 帮助7 S" b& e8 C) |5 T. O
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
H2 i- C4 @& D7 a: S2 Q! f5 C+ _> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz% k! T2 ?4 B7 P) {
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz ; H1 R2 Y) E0 b0 P
- `) d0 ^& C( n8 `
% v: B; F1 L! Y! X6 s6 Y6 o
编译:
8 K. f+ \: C* q; p- M# E$ f==========) Y0 g' F/ r. B8 R7 A
> sfe a ; 帮助
/ J/ e9 I: \) l> sfe a src.asm ; 编译 src.asm' @7 ?5 H$ d! p* a3 h+ n: _, L3 `
> sfe a src.asm d ; 编译 src.asm, 完整输出
6 d0 ?; J3 A4 R6 X> sfe a "mov r12, #1234h" ; 单句编译
4 v3 F& T0 F1 Q0 T3 k> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译/ t1 `$ x" R+ ^" u4 W
> sfe a src.asm,TST ; src.asm编译成补丁格式
' I3 f- q- Q, a' v' L" j, k> sfe a src.asm,TST p ; src.asm编译成补丁格式+ I. N/ g1 H( s2 l2 g
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行0 V& d5 X" t. p0 e3 K
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000002 T' V! r. M6 x4 @% b$ u
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。9 F& t( r9 |4 e; i
; r* r Q' k" `) O' v- u+ A*) See Assembler Part to get more 'assembler' function detail8 K0 S! m9 g4 T3 f/ {' x
& x6 `0 M* t1 s9 x# p
5 g/ j( s$ ^) W" y- r1 {反汇编:+ o8 x: E8 Y/ P1 a0 j
=============
, G6 \0 `0 K! `; ~> sfe d ; 帮助1 ~- f) k3 B9 U# T
> sfe d src.bin ; 反汇编 src.bin
N( M5 t( N- f( c4 T& p> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin$ ~0 O0 e5 b; \4 v, E' `( c! s x
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节, C4 ^, \5 ?0 v2 F, r- Q; K
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000/ m: N- U9 y) G7 ^# d) s, V
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
0 A9 J& v/ K o- z( j h* Y2 V> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
8 @: H, {4 p* c0 U- G! k( @! ~9 r5 ?: @> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件* W" n7 w1 n* |3 z8 K. n. t& {3 ?! E
> sfe d image.bmp ; 单色图形汇编输出
0 b: ]7 y6 ]5 ?/ \, R> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。7 H% k& R! }0 p
- b" \8 ~$ r! x, _2 P调试:
+ G, r# z) ]- ~1 g+ {=========
1 H. I' b" I$ V, c! x) w> sfe r ; 帮助
2 [6 A$ H# Y) v7 B% A, e. x% x> sfe r src.bin ; 运行 src.bin
# I- d, e9 F, c4 I3 A> sfe r src.asm ; 运行 src.asm 汇编文件. y& Q1 r5 a( K
> sfe r src.asm ,n ; 同上, 正常输出! A' K, j0 R8 x
> sfe r src.bin,200 ; 从 0x200 地址开始运行: U% O H, b- H% y
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200& f" B/ e! |) u: R5 W$ {. H
> sfe r src.bin b00000 ; 以 B00000 为基址运行
1 F6 p$ o, C) J0 W3 x0 g> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
4 \- l# @% [% G8 z+ M+ q* @( G# ^/ u> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
: U2 L( s' E+ b7 o3 J6 T' ^5 M# x" a$ k- Q: S8 v* X; u
. R( E! H- c9 K0 }
交互调试:
$ D$ c# _; @2 F3 z" z5 u======================
% L0 b A/ i( g8 _& f: b> h ; 帮助
% o7 u" v3 L8 S) N& g> g a00000 ; 到地址 a00000# I. H; `+ m& b0 o$ @( L
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)5 u# r: u. s9 Y W- Q8 q( |* c! r* |
> d ; dump 内存 (现在地址)
. M4 N. B" d7 N0 L5 s3 R> d a00000 ; dump a00000 开始的内存6 O2 P: U- Q) O3 x9 Q( E' \4 Z
> d a00000 200 ; dump a00000 开始的内存, 大小 0x2002 D! q, q' E0 l0 J3 t* U
> d r ; dump 注册
, x' S' S3 [ t) h> a ; 单句汇编
2 K; @- w" k7 r5 k" ^3 [( M> a c7d530 ; 单句汇编地址在 c7d530
8 y) H9 O! I! E9 `* e. _8 {> u ; 显示反汇编
4 t/ a: N; Y- g/ x$ Q* [> u a00020 ; 显示地址 a00020的反汇编
& B, ^1 {9 H) y% ^4 F> r ; 在现在的地址上执行一条语句
9 I" K3 l- g; a( |! r; w> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
" v: x3 d5 ^% J8 v# F5 l> r 0 ; 运行到返回语句
1 O' w2 _7 M. x: e1 ^% A; k> r -c7d580 ; 运行到地址 c7d580+ |0 K# T3 S5 e7 |5 s
> q ; 退出3 ~5 l' E3 O" c5 G: _ c
3 E8 i# @$ n! g, U2 s/ R
*) 所有未声明的语句都会改变当前地址。) D( @3 F2 ?* p+ ^6 M. v
2 ~ B5 j- O5 h
8 r, R8 r) J3 z# x: ^/ p& P特别的助记符:4 I0 f6 ]9 `" X u' X4 ?
============================
# z/ j; f, Z0 B3 g*) 所有C166的汇编格式4 T7 t: Y, b5 z) {( u/ ^. j* q
*) 分号用于注释 (在一行的任何地方)
) n2 w6 m% w! T& w, u! ~# F*) 特别的助记符如下 :3 B, x7 @4 T: R6 [2 J: }4 D& \
#include filename ; 包含文件(各种定义)
! L$ ~, A' d. Q% l" ] #define var value ; 设置替代变量 var = value- G* L* Q, G& X+ `. ~! E1 a7 D
var equ value ; 变量取值 var = value$ _* H# `! b: Z6 G7 R- E
db 'X',36h ; 定义 byte(s) 数据区
7 K: g: Q. K- Z1 ^- n F* X" { dw 1234h,0,'AB' ; 定义 word(s) 数据区
/ F1 r, D7 v# F3 N$ }$ | org ; 设定当前地址
/ a c( P2 E! G3 y base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)- M; k( F7 l) E# @' ^
end ; 结束记号8 b( ? h0 ^0 I
;#name XXX.string ; 定义补丁名称 (XXX)4 V! {) n2 C* B* ^7 `" \* o
' ; 注释将一起进入补丁
! k v- T/ n0 ?1 x. m; O '' ; 注释将一起进入补丁,加回车" O* \5 n; y) L/ N
'; ; 以下内容将全部是注释,直到出现 ''
$ |' _! q4 x# O$ I. w6 o6 F( ? R; w' Y ;' ; 注释将一起进入补丁" y5 z1 I, N/ T; y: x) \
+ - * / % ; 加, 减, 乘, 除, 求模 操作
8 o; T$ M) e2 N: \ >> > < << ; 右移左移操作, X+ C0 F: S6 y7 l* p: @" e! k8 W M
& && | || ^ ^^ ; 与, 或, 与非操作4 {% u, R; J- v( w. v' {
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
% O# {$ _' E7 B8 T: S( ]$ r8 s! O page(value), $ D" x! D! r0 f2 G( u2 v
pag(value),5 d( H m1 [7 x" i0 z; ^
p(value) ; 页值 (= value / 0x4000)* [% Y8 i1 t/ w v
pof(value),
7 O* M+ S- k; @9 a q(value) ; 页偏移值 (= value mod 0x4000)
6 J$ ^ [" j" E- N segment(value),
/ u* ^6 V1 I; a* Z" q, ^ seg(value),4 {& J8 A# }0 f) S, p( n
s(value) ; 段值 (= value div 0xFFFF)) z2 U/ R; A; h/ Q
offset(value),
- o: m, L8 ]# r5 v ofs(value),, A6 `3 O& \% l/ c2 s" a' g' p
sof(value),# Q) [) X3 X" _% e# G
o(value) ; 段偏移值 (= value mod 0xFFFF), Y% [1 ~2 K+ e/ I: m4 [7 i
# ~/ F5 k- x4 Q2 x; j1 x*) 例子:
# T, q z0 T- `3 y
; L1 q+ m! k* w1 ^;--- Testing ---
- a1 O) M' v" R; v; j1 H: }& a m; e# s
base 0A00000h ; 自动转换文件地址为 SL45 内存地址
! D. a2 V/ ~1 g6 X2 E, X! g# z; Q7 k& a0 E0 m m
#ifdef ME45
& U- f; s$ O! G/ q; B7 Z #include me45.inc
1 S9 I3 Q6 S: j2 [+ w#else b0 J* J3 Z6 Z1 S1 b$ M2 Z
#include sl45.inc
# u$ M% W. S( `2 ?: E r" c9 Q #define FreeRAM 37h:3600h6 a W8 `7 g. B6 P" ^) Y8 Y9 {+ V/ w
#define memcpy 0c7b384h( b1 V% N8 ?2 h) a1 R
#endif
( @2 n- ^2 |8 M& n9 f5 T. S4 S. |8 S- ?+ J7 \
;#name TST. Test Patch ; 补丁名, q4 W* I+ q- i7 _' j! j8 _
' q! G9 M$ u3 c+ a: P+ f l: ^4 x
'Firmware : sl45v56) J! F- f9 l3 w
'Author : rizapn
7 h' X! h5 m# f2 \: c9 D! r. x'Updated : Aug 18, 2004
9 N8 T+ E, b$ y5 V# r! _2 ^" Z1 M+ s, c& R/ Z$ s6 K
org 0c7e000h5 v# l O# ^7 L5 a3 Y
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
0 h, b. O+ l! ]5 _/ z: G4 G0 B mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值- t$ H, @: ?$ t1 W6 l
extp #p(data2), #1 ; 跳到 data2 页* @" Q7 \/ O; D) O
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)! k7 z: a/ U3 ^+ `
callr sub_1 ; 页内调用
/ T4 j6 D6 a- v4 C movb rl2, #'A' ; 得到 ASCII 码 'A'
# O! `* K2 K( T$ X7 f9 m1 q; yloop_1:( V; {* }2 p: J& T
mov r2, #1234h1 g' ?+ L3 [. J) d9 G
mov [-r0], r21 h) b m e: `4 u+ B. C$ S
calls memcpy ; 调用段表示的子程序
+ ^/ o u; l' [' {3 C add r0, #26 h8 ? P. c" ?3 h& |
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
- x! }5 @. S- e$ r3 g; d* A3 Y rets& J( O) j: J: W# P
( I6 B$ B4 b$ C9 g6 ysub_1:0 V* B4 \3 ]+ O* ^6 J" a$ ]6 b8 T
mov r4, #1234h4 n( k" M \ W% b+ f1 f
ret( A# @9 Z2 @$ f7 |9 x
1 a- @. n3 z- x! [( O! Y9 Y J1 V l
data2:! i, m& Y3 { B% C- O; k. o% x
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
6 H, J/ e7 ]- g! ^
3 B, j9 V4 j6 c" n c0 ~: Hend
& n3 r' R% G0 G" u- s& N- K: l, X% e% h
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5 @2 v! `2 I1 k ?6 L( N9 ]
5 l9 r, b1 L7 h" H; YAllaahu Akbar,1 w2 O$ A4 Y0 I" n N% |5 ^& l
RizaPN <rizapn@yahoo.com>
- J. u9 U+ P% V: f6 w2 u0 uJakarta - Indonesia
$ Z9 B- p- }: q! Y& L) t" S3 ]" B/ V$ ?5 r$ ~& M/ {
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|