- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
) ]3 [7 d# b: E. h7 ^$ F. k' F; N, K, I. z" g- w! D& H, l
简单帮助:
7 g. y/ _% l/ W4 l====================
+ ~+ I3 M. v8 z9 H4 f*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。- @, W1 v, w2 ?) J) j s+ f
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
4 J/ j7 e5 W! l, S6 _0 @8 g
' B h# b- `8 O+ g
B3 R% o& v: `2 H* E( o: m搜索空白区:
/ a$ M2 d( V; A0 b=====================, T/ t( D& x9 w+ ]' Y, W
> sfe 0 ; 帮助: _; }% {( N+ y+ y# {9 w
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes). }2 B' s/ U1 `
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
2 R& a" O7 Z2 u! s9 N0 Z1 y3 }( @ f# b9 \
二进制拷贝:
* T$ }/ o# V* `. `============
3 n. s/ @$ `4 |> sfe b ; 帮助
- Y' U1 F9 N3 U2 `" d `> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
, z& I ?% \6 V* e5 h& x) P6 y* q> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
: N6 e' |9 R3 F) U, _> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
) B! V. l+ C. O6 e# b+ o> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
. F; c& A7 _. {) b4 _4 h- \5 Z% @/ W) Z4 D' Z2 z
比较文件:6 | v8 I0 ~9 Z' \
==============1 D# d3 c6 W+ T5 ]
> sfe c ; 帮助
0 w! I+ }+ V1 g! D> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin, n4 @) u9 _' ?, t! j" U
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
: C: |& O% w4 U3 L' q2 W% {> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
. b3 y8 g8 z/ y0 }. \" E% n) {> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )# N/ X3 m# ^, z# d2 n1 y" T
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
s/ m6 O: E3 S, \> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes9 y% h3 h( V2 ^: E) b' J
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处) {" U4 n5 n) |& C$ @
8 _& h y: @7 Y( e5 h S, k
发现16进制的地方:: b# N4 g, }% @8 j- X, s, I
====================
: C% ^5 ?5 X7 h5 h> sfe f ; 帮助- I- h* @- j' A" {; s" q
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
* F/ {# J/ k* X: ^, P- r; W: N> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
, l a4 ?; e" G1 C7 J$ d d3 o> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes( j$ _9 }* G+ b5 |* x$ j
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
- E$ t9 u1 n$ A: L9 Q5 [! a> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
9 p) Q4 m, j" d0 G5 Y' E> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.% y: g! B) t3 H/ u5 h5 U
1 U3 I% u: b8 C6 ~# G. m) r/ H6 X( L. \8 a提取语言数据:& z, [9 s K. F+ R
======================7 }& B+ q: f/ s: {: O0 I9 I `
> sfe l ; 帮助 Y: J9 k0 I. ~2 G. i) d' i6 Y1 R; u
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据% l- m6 I' k! \$ H6 J/ D Z
> sfe l src.bin 200 ; 显示 ID 200 的字符串) E9 B @+ T2 ~9 J
> sfe l src.bin 200 2 ; 用第三种语言显示字符串
$ [; p- C5 h5 _8 o" X5 O> sfe l src.bin -1 ; 提取第二种语言
T* s& [, A5 V; A! e/ |> sfe l src.bin -all ; 提取所有现存语言
% }: x% V* n; w& p! X> sfe l src.bin 'Testing ; 转换 'Testing' 字符串 [! l8 b0 e5 K
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
/ G2 S6 k) e' R0 D+ W: F/ G> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
0 w+ n% ^$ |7 B4 g& @> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 / x# K! C1 Z% K9 @- E
> sfe l test.lng ; 检查test.lng 语言包0 X3 Y0 K6 q5 l' c z
> sfe lc test.lng ; 检查和更正test.lng 语言包
4 `7 _# f! W* S: P: c# W% Y/ d) c7 b5 `$ w1 D* B
提取菜单:7 [+ @+ y& Y' s
=============- P; o. B/ o4 y/ s- \, ]2 N5 k; W
> sfe m ; 帮助
, D8 W7 u# s) [6 a2 s0 F> sfe m src.bin ; 提取菜单结构和入口
' f' o4 m4 w6 u [; c |$ ^ P7 S$ l
: v% |6 k3 I$ A0 j补丁:
% s# g6 R3 g C$ Q. k) i3 S. w& z" h=========
% Z7 w9 j# J' f6 |5 Q# F9 c& F> sfe p ; 帮助
& u( ?' [; @ D0 O, d> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin6 t6 q, X2 m# ?7 t3 G" C5 O
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
1 y0 R) F9 R4 Z8 t% g8 G# @> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
' C- N8 b9 ~# [2 c. {
" g/ |' I7 W+ C* v& Y2 r
7 j* \ V4 g2 u' d. j1 ^编译:
5 i' a* {6 j7 \/ w9 o" l5 o==========
e# F7 p k, u; G$ p> sfe a ; 帮助
/ m4 u/ H, k( [' X/ A: x6 z> sfe a src.asm ; 编译 src.asm
: x: N) P6 M x. J$ v; B> sfe a src.asm d ; 编译 src.asm, 完整输出0 I% i1 A5 a1 f" ^, f, b+ [
> sfe a "mov r12, #1234h" ; 单句编译
2 |9 q" y0 c. y$ f5 q6 V6 U> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译, G) t$ A7 P' R1 D
> sfe a src.asm,TST ; src.asm编译成补丁格式; W! a0 F- o+ v; t: k: z2 d( Y
> sfe a src.asm,TST p ; src.asm编译成补丁格式5 b$ _; L, F8 _. b. D; ^0 E
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行5 _4 L! \& ?; t, }- P+ e- [
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000006 J% \' h4 u. p+ V- a+ v
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。/ [. H8 V e; q) E5 B. M0 b2 G+ d
! Q( x. w2 L4 T: H+ |
*) See Assembler Part to get more 'assembler' function detail
$ y7 x% }$ z( {/ @2 ^* N1 r; D, A. S% z* X( B& l4 c
" W \! B. [( L: E5 I A+ U0 b% Q反汇编:4 H6 _9 p! n1 c, w }- c2 t: z' p$ {
=============
. P2 c& `% c2 u) b. h' U> sfe d ; 帮助* w+ A1 W- r) Z) X- v
> sfe d src.bin ; 反汇编 src.bin
5 J' o d. x3 ?/ l/ P> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
9 ~6 s# f n+ N6 s> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节, K' F5 d. p8 ]5 j8 ]
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000' c6 x% l \' ^" Y8 A, c+ |
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
3 W* H) X% J3 z6 v- m' A> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
7 B( J1 k4 }9 {$ \+ @# `0 }6 q! n> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件; n6 z/ e) l2 K+ U
> sfe d image.bmp ; 单色图形汇编输出
y0 ?4 G0 a2 j5 S" T8 j> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。2 D0 W+ U1 ]. G: R7 H) g7 S
% l* h9 I& ]1 \: Q! f* O
调试:0 G+ X+ u1 m a
=========
1 E- g. F+ v* B> sfe r ; 帮助
! `( X4 Q5 ^) K3 l! x! C. n3 I> sfe r src.bin ; 运行 src.bin
! S2 a. W, R% I* w) z) ?/ J> sfe r src.asm ; 运行 src.asm 汇编文件
( F% y) r: u, m> sfe r src.asm ,n ; 同上, 正常输出+ L& V5 b% W1 l0 ?' }5 V: x, N
> sfe r src.bin,200 ; 从 0x200 地址开始运行' c' J5 W5 I3 O. C+ P, V# C
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200, [& y+ B, \* c/ i. y
> sfe r src.bin b00000 ; 以 B00000 为基址运行$ }( Y; T/ ^7 @! C
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
1 y, X' {7 n) k0 ^" c> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
4 ?9 H i" X; q& G( F% n( m% ]+ e4 z9 f, G( g; O
$ J9 U4 ]. S, u/ U1 x交互调试:! O1 C7 R% e7 w8 @% m
======================, D& f$ T$ }2 w( n
> h ; 帮助0 n' o4 g, ]9 Z1 }- i
> g a00000 ; 到地址 a00000
/ O2 `6 p7 r! l) I2 B5 I> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
9 a+ k' E' T. D6 s3 g5 }" c; _> d ; dump 内存 (现在地址); C. m1 {7 R# z$ _
> d a00000 ; dump a00000 开始的内存
! Z; G5 A W S4 [6 K) }> d a00000 200 ; dump a00000 开始的内存, 大小 0x200& w. p9 u! C) T6 G5 n, L2 ~
> d r ; dump 注册; l/ A1 N. V% f5 s1 j3 D
> a ; 单句汇编. q' K4 q* b$ T" t4 I- }7 i- w% p
> a c7d530 ; 单句汇编地址在 c7d5302 B" B- q! C5 T4 ~) Y
> u ; 显示反汇编
B8 b2 F. ]1 w7 K3 _3 n> u a00020 ; 显示地址 a00020的反汇编; k$ i) G% {0 }* @2 i* n
> r ; 在现在的地址上执行一条语句
! u0 O/ e$ B& t' {> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)* W0 j! |+ y; V5 S# a: _
> r 0 ; 运行到返回语句
1 U5 K- b/ m" A! v1 W, D> r -c7d580 ; 运行到地址 c7d5809 _' c( P6 T- }8 |8 ]4 H: T
> q ; 退出
& ~/ Q* q: R8 y4 N5 I! N! y. ?% K; O# r G; J2 S3 s
*) 所有未声明的语句都会改变当前地址。
2 J6 i: c9 X- `: g3 T
) J7 t$ A7 |! _ [! n! S
7 j1 {) d F/ B# f7 N& o$ z+ _: u特别的助记符:' T8 m' z- N' h1 Y
============================
* q6 i- U* ]8 v# y( L! M*) 所有C166的汇编格式- W6 r% ?7 z+ r7 z. l' B
*) 分号用于注释 (在一行的任何地方)
" ]9 M' |9 m" _*) 特别的助记符如下 :/ J4 {( o& T8 m h; t/ V+ K. |
#include filename ; 包含文件(各种定义)
1 q" d( T; h3 ~: A* N3 Q #define var value ; 设置替代变量 var = value
7 [5 x0 B1 s! g4 n, l5 \3 w var equ value ; 变量取值 var = value1 b/ P j+ N4 V6 |+ a5 j
db 'X',36h ; 定义 byte(s) 数据区
. n7 m, f: d |7 d' G! p3 s4 m) O dw 1234h,0,'AB' ; 定义 word(s) 数据区
5 X1 |: j5 u( K- A( z; {& C n org ; 设定当前地址
$ Y* ?1 j+ I+ Y" A. _9 A, H base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)2 L1 `0 M& @( U8 Q: n& N' Y% E& c- G+ r
end ; 结束记号& q% d5 E& p, |+ X
;#name XXX.string ; 定义补丁名称 (XXX)
8 S; C* o0 @4 B ' ; 注释将一起进入补丁
/ Y! G- x' m) F4 S2 S" f( s '' ; 注释将一起进入补丁,加回车
8 H- Z/ L* ]0 j7 F! J i '; ; 以下内容将全部是注释,直到出现 ''( u6 N# }5 E- T& T) e
;' ; 注释将一起进入补丁
8 B$ N4 B+ n' [! R + - * / % ; 加, 减, 乘, 除, 求模 操作( L/ U! I" t: C4 ?% p R
>> > < << ; 右移左移操作' e: a( n' v, M! y2 e
& && | || ^ ^^ ; 与, 或, 与非操作
2 y }( J/ [/ h9 b5 Q5 c+ y" l! o. a val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
: L/ m }1 [0 A" ] page(value),
7 |2 h4 G# p" D- O" [, T9 `$ W pag(value),: A# ~0 S/ o3 U1 {
p(value) ; 页值 (= value / 0x4000)
- G- ^' x% A$ x6 Y9 | pof(value),
}5 d' ~9 { \! v4 i) s7 h q(value) ; 页偏移值 (= value mod 0x4000)
; U5 O1 [0 F" o% {% |' O! u( O segment(value),
7 c4 m5 }3 `+ s k4 C, O seg(value),
) i3 j7 ~) A( C s(value) ; 段值 (= value div 0xFFFF)6 Z* C6 e( W& [ B+ }
offset(value),9 g# K/ O) Z2 b7 \) D% E( B% ?
ofs(value),/ f8 s% ?# F% j7 z
sof(value), n) Z% b; P t1 c* |
o(value) ; 段偏移值 (= value mod 0xFFFF)
" H1 [- _' \" {* x5 K; D$ B7 g
# ]* h: ~( t& y0 f2 g*) 例子:
+ q/ i1 V8 c& C/ J" W
+ j2 d6 e( }5 q$ h; ~" S$ i;--- Testing ---+ D) T: o _6 a: X2 g3 q# m
& D- W0 w3 U% t2 I b+ a
base 0A00000h ; 自动转换文件地址为 SL45 内存地址
. n* @; b- \: E5 b' j; A% u) {$ O# x8 e- L) D1 g+ I
#ifdef ME45& r3 i2 c5 F1 J4 I" [& V
#include me45.inc
! b" A- s6 w9 G% K, c#else) d( X( F; o" c; T. V6 U3 n- `
#include sl45.inc
+ ^- m0 F1 w3 ?& ^6 g" y# Q #define FreeRAM 37h:3600h
) z$ }0 O. a" A' i5 W #define memcpy 0c7b384h
% _9 Q; M# o6 W, p#endif
; Q9 [: `! _, a! [, U) s1 F! z. L1 u* h K1 L6 R
;#name TST. Test Patch ; 补丁名3 x8 d' I, R6 A, C/ v2 A6 E
2 M! p& I. L# s2 I
'Firmware : sl45v56
) e1 Q5 C2 T( k$ A6 o' l8 {* M1 C$ h% A'Author : rizapn3 |; F \# M1 Q, b% V
'Updated : Aug 18, 2004+ p2 \( I, @+ a2 {2 Z
5 V; f0 Q0 w& s# C5 k; l# Q
org 0c7e000h
( i9 D/ z# {- z7 j. p mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移. N6 t+ P* O0 L4 ?$ T6 e+ \$ a
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值9 Y- S4 X3 E0 o
extp #p(data2), #1 ; 跳到 data2 页6 I) l$ V/ d8 V; B) t+ G
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)" z( W0 W$ D4 Q' V, z7 r
callr sub_1 ; 页内调用
5 x, b) A% D# i5 p- _ movb rl2, #'A' ; 得到 ASCII 码 'A'
, _( X1 h |- f9 Q n# z ]loop_1:: _* w5 R. i/ g) H" L2 s$ g
mov r2, #1234h
9 _ h' E( X; N _2 \! P3 q# T& y mov [-r0], r2
! ]: h7 k" d/ p8 R _( D0 P* F8 G/ N calls memcpy ; 调用段表示的子程序
4 W' }: \" @ N" \8 E add r0, #2: i2 G+ `( `. N# j1 G2 O
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处7 w- V; E! i; Y* r
rets) E- N* I1 c' b3 D3 A
6 P1 m$ _7 o$ X) A' i
sub_1:
; _7 N6 e3 t* B# O/ ?/ k/ {/ b mov r4, #1234h
( w/ Y/ g0 D8 y9 }& ? ret
% ]) T d8 X d; q
6 S4 d: I- b' c5 o4 zdata2:
# V+ Q" M) v0 s9 Z4 a" o; y/ w6 D1 ~ db 'A',10h,'Testing',0 ; 定义 bytes 型数据区( c: v; V. l; i6 j/ o( |
1 f1 w! f7 Z; j: R/ k4 _6 U- w( W
end
, D. i5 ^: r+ q6 z$ I. R, ?& O2 g4 c* b. s
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# [# [/ R; ]9 y7 T9 N, u* s
4 }4 |, r. D- |/ v8 lAllaahu Akbar,0 b4 `6 `# u' Z; N
RizaPN <rizapn@yahoo.com>- T9 ^: u; X4 G) j
Jakarta - Indonesia, ^ d S1 c& k' q& t }/ G$ A
% \: D' z4 G0 f* c9 t# O& U. E[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|