- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
# p5 h& u$ w4 H( Y: I" m5 L+ _7 `8 D- m. v$ o
简单帮助:
p) U1 s: w. }" S* m0 o) \====================
; q+ T u# q: _+ x7 {; |*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。" N- F) {; b5 J3 O5 `' ^ [
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.9 o; d! s* G' `* y; C5 j3 l
7 I* r% z! ~, s& C
6 }& V ^/ c( |( Q搜索空白区:
: b7 U; U# V0 i+ g0 Z# q" ~=====================
3 n8 x% G7 n' m% ?> sfe 0 ; 帮助 _1 c: P. m { E
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)! p0 @& j8 J7 n" r8 A
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
k# q; Q& N& I: G: g; g9 J1 n; c+ V4 t" d1 o* `) l
二进制拷贝:+ Z% n6 Z# W/ B& j+ H
============
* K4 X( r) P, Z5 w; {* l9 D> sfe b ; 帮助7 X: C% {2 _ M. X' i1 k% B6 \! m; G
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
- Z" n9 w% [2 A+ Z) V> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
; `# U6 J0 @) r" |2 m> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
0 F4 n# Z6 `$ g. I; a> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
( l: y8 C2 X9 }# L! d4 J
; V5 }" O( ~4 h, c+ t( e* Z比较文件:6 T0 g q, s0 v! T# F6 _% ?' Z
==============
0 ~6 w6 O4 u9 `9 R> sfe c ; 帮助$ ^ }3 r$ R8 t1 ~1 t6 O
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
2 f/ t* K3 t% H8 l! D N0 I> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
& g5 K( M" i" i& \> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes* m1 j8 B8 i7 r! J# k" w
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 ); `. h, h3 r+ v' n) R- y. J$ H
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A000003 V' t" v2 P _3 V$ U% d
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes( }& \4 m/ f' e, e! V6 [+ l% }
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)/ A4 Z; T% a! p/ ]1 e. `
O9 ]8 e; E' m' W; X5 H
发现16进制的地方:+ t3 a, Z9 ]& S7 t
====================
- A; e4 ?1 h+ w. N" }> sfe f ; 帮助
% f, x) z% Q2 V7 i, T> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个2 C) S6 ?- y% H: H5 a1 N& c+ `1 \/ J: e
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找5 H2 S8 M% h5 t a2 V" M
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
r+ t- T+ ? M t$ L% R> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
/ p: A L# [. I$ r> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
$ N4 L; l5 @# w& o" m0 O> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.& r' Y6 y6 L. b0 x7 K- @5 I4 O
7 H: k2 {7 B- }' V P
提取语言数据:3 y1 t) V% ?- t/ Z
======================
$ a; A' B8 C% d ?& k> sfe l ; 帮助 d2 d1 a% W/ [- e' ]. y
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据* t X1 B$ W0 C# C' x
> sfe l src.bin 200 ; 显示 ID 200 的字符串& }/ p) E0 m& r- ?* h; n* r8 s
> sfe l src.bin 200 2 ; 用第三种语言显示字符串9 [- M" i2 r# Q L* `: S Y5 x
> sfe l src.bin -1 ; 提取第二种语言! W% o8 B6 l, B
> sfe l src.bin -all ; 提取所有现存语言 C) [5 F% ?( M6 S8 h
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串8 D- p% y. s- q( U4 l( B
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)! |7 C5 u( U! E7 B2 U: V* @
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本8 e; n7 g/ p( G5 _
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 - E- g2 _7 D( f
> sfe l test.lng ; 检查test.lng 语言包) r' |7 ~# }0 Y, Q9 L
> sfe lc test.lng ; 检查和更正test.lng 语言包
$ |0 s" z. r0 F& D/ J n# \* l0 n$ p0 r
提取菜单:
+ b4 M: R# B) N% w2 k=============
H+ W X% ^4 S8 _* Y/ f3 c$ u) x> sfe m ; 帮助
2 e4 p. d. G1 l0 i! f> sfe m src.bin ; 提取菜单结构和入口
1 N3 ?! W- c( g/ m6 n& d; U% Y( x% ]& O3 L7 D2 \! S* c
* O) ] p9 F: k$ |
补丁:) o5 z: x1 y; t; v
=========
( [3 @* p [# F8 w9 W( F& d> sfe p ; 帮助
* d) f [$ u$ }" M2 \! j* ?+ D> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin& o! {) u5 T! F9 d r
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
2 N6 _% s, [# A$ S> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz $ Y; n; G/ T7 B! s8 X# m2 I
$ q9 J+ F6 ]% z4 x% z
1 `- _, y0 S# G8 Y9 j
编译:
9 a* J8 b; s/ D1 k==========8 R7 O. X$ N5 i9 l; b
> sfe a ; 帮助6 X! \4 n* U# T
> sfe a src.asm ; 编译 src.asm
& [& Z z5 N+ Q0 M9 V- E> sfe a src.asm d ; 编译 src.asm, 完整输出. h0 @& N, A- t3 z7 z# c& J' \. |
> sfe a "mov r12, #1234h" ; 单句编译" B. ]$ X: Y+ ?; a, @/ j8 v/ _
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
0 D( @! A. V- F( J6 w> sfe a src.asm,TST ; src.asm编译成补丁格式
* `: [$ s9 I) f4 s* m L4 B> sfe a src.asm,TST p ; src.asm编译成补丁格式# r# p0 ^- Y: F# R: T6 z
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
$ W7 G/ j; |- M! h& n: A3 F! B> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000; o5 Z( b: ^, ~8 l }2 S
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
) A/ E$ i' ^/ V) S1 O9 Q6 V/ n+ V }3 b! l9 P+ ~
*) See Assembler Part to get more 'assembler' function detail
3 K. b# z& @+ S5 u3 i
& Q- x* ^+ N. P; U' w7 a+ U7 w+ @9 a* x' W4 m
反汇编:2 m' u$ f( V- X8 g) b% Q P! g
=============8 Y$ K- r1 O" K8 H( p0 |; \
> sfe d ; 帮助+ \, j, ]: ]/ z6 D. ]% [$ H
> sfe d src.bin ; 反汇编 src.bin0 ^2 G' t J5 }, ?
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin! @7 o* V6 {0 q1 q' {3 S
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
; r" l' k( O0 C$ Q4 J/ j> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000' @$ u9 d K: S+ ^4 m5 V' O
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止" H9 X }, k7 o( _# G+ n% H- \5 Y
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
8 X0 i' u. F3 w+ h: h> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
. P `0 K2 t0 t: ], \% v> sfe d image.bmp ; 单色图形汇编输出7 u* y7 [0 |* R2 E G& x; `* X
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
K4 J; S: |. n# w/ X9 A! x/ ^* x) I4 C$ F2 [. Z5 O& P
调试:
9 L0 @# q. b: a* ~7 ~# X* X=========
7 C% C! P1 C- O8 F0 Q( y4 _' N> sfe r ; 帮助+ e# S% B" G8 m/ _
> sfe r src.bin ; 运行 src.bin
; V7 Q' w7 D- s/ O> sfe r src.asm ; 运行 src.asm 汇编文件
+ {* [. t% i$ {% h/ o> sfe r src.asm ,n ; 同上, 正常输出
: d5 Z: K: r) @5 X2 A1 {+ ^& b+ D/ x9 S> sfe r src.bin,200 ; 从 0x200 地址开始运行; H- ~ \: X8 H [; x* R
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2002 ?2 {7 Y( j9 p6 P `
> sfe r src.bin b00000 ; 以 B00000 为基址运行' W+ q& u, l, y% p9 L7 C4 q- x1 i5 E
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
b( W G1 i, Q# K9 j! Z2 N" V> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行: m5 R: \0 |' ~* n
, S3 o( }; x+ H8 V
" K$ T! ^# I6 _- t' J
交互调试:5 A" }; G+ v0 c
======================* C. f5 d R) t6 `) t
> h ; 帮助) b& K n9 `4 G# [
> g a00000 ; 到地址 a000001 i @# [+ |$ s0 j4 X5 ~
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
& }6 X9 b- _( B4 F$ W> d ; dump 内存 (现在地址)
" [8 q# s$ H! T7 m+ }9 J> d a00000 ; dump a00000 开始的内存0 V0 B$ b. p& ?9 C3 E5 i) ?
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
7 }5 j; X* R/ U, u2 @0 [> d r ; dump 注册
1 \- z! e! v- H! M" `/ W> a ; 单句汇编
9 w; M% S# Y4 w, t; Z# F6 U5 _> a c7d530 ; 单句汇编地址在 c7d530
) O' U4 V e! F2 l# y! Q: S" m4 R> u ; 显示反汇编) G0 g+ Y0 x# L2 w. K6 D* B
> u a00020 ; 显示地址 a00020的反汇编
G9 a6 ^1 L2 y: v+ A( ?# N# G> r ; 在现在的地址上执行一条语句
2 Z2 }. S+ z6 s! s+ g1 U1 I> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
{. k# F$ [1 ?0 N& U> r 0 ; 运行到返回语句
9 G: T5 N* c+ O0 B* d> r -c7d580 ; 运行到地址 c7d5804 U, {$ }! W3 m8 S# a, H3 t1 j3 r
> q ; 退出8 @6 `. b, ~, H% ]1 i' T
2 C8 G6 g" _# [) m6 c( Y* K! w*) 所有未声明的语句都会改变当前地址。
6 k& J) V$ a8 Q6 Z# |9 o' r4 ?* T; p3 y2 H- s4 H" c% I" ~
7 g0 K3 \) v+ g3 V8 a3 R9 }! H7 X+ R
特别的助记符:
4 _3 C4 |' U* y0 x: ^============================0 M7 y* v1 ^ r4 c* o' t3 K& S& T
*) 所有C166的汇编格式. p d' w5 j) T. u& F( T7 {- S: Z
*) 分号用于注释 (在一行的任何地方)$ ?& R4 d' x+ L( s0 z' Z7 l' N
*) 特别的助记符如下 :
6 \: X; S3 _/ u6 {8 E) W #include filename ; 包含文件(各种定义)5 u0 i! ?% ~" q. A/ {) B, P
#define var value ; 设置替代变量 var = value
: Z c' l& Z. n. U1 \* k$ Z var equ value ; 变量取值 var = value& s7 _- v" H6 h8 X( o
db 'X',36h ; 定义 byte(s) 数据区
/ {9 p8 j0 Y0 v# q dw 1234h,0,'AB' ; 定义 word(s) 数据区
; W3 K( B0 N/ M& M5 X. F0 b! P4 M org ; 设定当前地址8 W% ?3 N3 i- o) H4 M% [
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
9 K# {- Z- V2 o3 a% z n \ end ; 结束记号 _' ^9 f5 s7 l) A
;#name XXX.string ; 定义补丁名称 (XXX). g4 w" e" m, B9 [: V7 y* g
' ; 注释将一起进入补丁+ i3 r/ }& T! l. R Z
'' ; 注释将一起进入补丁,加回车# y# E) Q" H# ]( j! x% t. v4 k2 `/ u
'; ; 以下内容将全部是注释,直到出现 ''' \/ M$ i5 h ^. r7 q- v+ L
;' ; 注释将一起进入补丁
" l; N' X; a/ T + - * / % ; 加, 减, 乘, 除, 求模 操作
; m& ?' E' V$ w3 r. ] >> > < << ; 右移左移操作9 I, A+ k( C9 |/ \7 O1 i! _0 V
& && | || ^ ^^ ; 与, 或, 与非操作
8 W D5 Z) W" q val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)$ I0 i- q* ~& e- z1 t- H
page(value), # J7 u" Y q/ }2 l' O! v
pag(value),
3 ~; ^2 U( g) c0 B$ k" ? p(value) ; 页值 (= value / 0x4000)
3 Z! F& d p/ p7 j: e5 f3 W2 Y pof(value),
9 i0 y8 M" s6 A, e3 i$ m q(value) ; 页偏移值 (= value mod 0x4000)
0 r$ G, c/ Y0 {+ m' @# J segment(value),( g' i4 [/ f0 }% y2 _; Y$ Q
seg(value),& V+ f( T& {0 j8 d- K
s(value) ; 段值 (= value div 0xFFFF)
# C$ O& V' h1 v" n offset(value),
8 K* ]* a0 n7 v ofs(value),- Q0 |" h8 v; `, y P$ ~' Y
sof(value),
* R8 k, Q5 s2 G o(value) ; 段偏移值 (= value mod 0xFFFF)
1 Q! Y$ ]6 X% i! F$ U1 q$ W( }8 o4 [* n s- w+ h+ _7 O/ G
*) 例子:
( o- x2 _7 H5 u
3 x' f* r$ F) q2 ]7 l; h# j;--- Testing ---3 E9 s' Y. @ M! K
$ A$ b; \: R3 h9 Y% v4 X8 Tbase 0A00000h ; 自动转换文件地址为 SL45 内存地址+ l; D1 b& O5 I& P. m
6 V' Y' u9 E& d% a& Y& p#ifdef ME45
W( Z `; S+ ?9 \! f# H/ ^* Q2 D #include me45.inc/ c2 s# o, w0 h8 k% q) `
#else2 ^7 k/ F; |. M* p# t9 O
#include sl45.inc
$ C1 L9 t% d- z: Y #define FreeRAM 37h:3600h
& Q9 G4 z/ g; S% @ #define memcpy 0c7b384h
5 v3 L5 K4 T/ J+ L; R. m' r#endif. P% k3 I' b% b
. F, J6 L# h8 q; j1 u6 ]
;#name TST. Test Patch ; 补丁名( b, c, u1 J+ ?/ W) b% T$ P
1 W4 h& W) S: U% T3 v* F( d( d3 k'Firmware : sl45v562 _9 I0 v3 ], H
'Author : rizapn, \1 O( j1 J* ]
'Updated : Aug 18, 2004
$ C# t4 q* ] c) y. v, V% ?
# J7 U1 i! U6 O( C9 j! korg 0c7e000h
* \0 C* M5 v; Y5 e$ V% l mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移0 k* D; @+ ?3 b% x5 n
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
4 S6 X/ x4 f1 \' N extp #p(data2), #1 ; 跳到 data2 页
6 `( y4 B1 ^. p5 O/ |; {2 c7 D movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
8 I/ S4 p( V3 {6 c+ x2 X7 F& P callr sub_1 ; 页内调用" t4 l# l6 j, ~0 k- a
movb rl2, #'A' ; 得到 ASCII 码 'A'
" u6 \( K3 A6 |- Ploop_1:) m! O( |. @ W, m
mov r2, #1234h
$ F- S9 ~! G Q5 x+ Q8 e3 B9 [. p mov [-r0], r2' z0 |9 [1 b6 e7 n; N% W7 Q
calls memcpy ; 调用段表示的子程序8 b4 A9 H# X9 x1 X7 \8 T
add r0, #2
" h: o( N* X# C8 b) M jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处% g) v8 t s( i1 Y
rets
" p% l- R8 ]+ u: d4 x8 z6 X
$ S4 _+ m+ E7 }9 m+ k- _. Zsub_1:7 r5 i; n/ L1 L5 B
mov r4, #1234h0 [/ k& m7 n$ D/ n2 Z
ret( M; J( Y, v" N+ {% O6 F( E
+ W8 J! n! I" S8 k, N, F
data2:# h! P0 b9 ~* c* z* M6 o8 M% h5 a
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区. e; K- V2 P9 y
8 p/ y8 q) e6 i
end7 {" ~2 B- P: C0 m# K
0 S# ] R. ~+ `! \5 K4 Y. B1 _7 g+ H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
( q9 m& e' K: A! g2 w) j, \4 e1 `
Allaahu Akbar,$ h* u1 I/ o0 G( P
RizaPN <rizapn@yahoo.com>
9 z( ^3 g+ t3 o% c* D& C- w9 {Jakarta - Indonesia
( v8 j! B+ p: Z8 p) y" ^3 v1 | e1 n: G3 H6 J& H/ ^
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|