- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:* x; U% r% {& N3 j
5 H2 r" V5 l+ A7 c简单帮助:
- M* N3 _) u- j! x" h4 }====================
: M* p; o! B5 |9 H3 y*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。9 R$ X' U: }6 J) _: [
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.) |. t7 v, h5 b6 _2 W5 ?# N
. c: a) C6 C% T2 ?9 J \3 y3 H! l, K: C: ^5 D8 m0 l
搜索空白区:
5 V: g9 o- a! `" |+ E$ B1 z=====================6 g0 M! S- w& }8 Y) s
> sfe 0 ; 帮助8 C# o" P, C) N9 p& @* O
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)7 [% o% f: B% b1 G
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间. R( w9 T! ]3 h4 q# f( R8 z$ m" }
9 s' I" m/ i' Z6 _% x0 y0 x1 u二进制拷贝:
- U% u3 f, W$ B6 R v3 G9 ]============
" }: ^! B! L6 y" d( y" K, `: @6 S1 F> sfe b ; 帮助
1 |; u, ]: i/ U0 G7 k> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
8 c, y: U& o* s; \/ m; L* ^> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
5 I. \3 N( X1 D4 D> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
$ U5 d( e) _& h) X9 ?/ H- I> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200, _4 V- u0 a% O( L
5 @5 P! `5 Q+ P/ S8 L5 N/ w, e比较文件:2 C8 `1 d5 Z, G1 e- A' k
==============
" E* ~$ L2 w6 S, x' T4 K> sfe c ; 帮助/ a5 Q" Z, G6 f) z1 x
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin+ O2 c u& ^0 |6 u8 T( f/ H" n, g5 ?
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )* X: y* V8 d8 L) }% q; A2 t
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes0 y8 D7 M- F8 X! _- f5 j* c# d
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
: d2 b) ]% Z H7 R% }6 e) i- H5 m> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
4 Z( c3 R/ i' d> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
* P' }, {. r" ^( B4 K> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
& {9 k) e8 j A- {5 e# P6 [% d7 {5 h: b: w" {* o; [
发现16进制的地方:
1 y# g8 B$ r( o. T====================$ J' l& u8 v* K
> sfe f ; 帮助3 a* k/ k. V+ K% c
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
( s' z# O6 S; A! f. V> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找' `2 J, R2 [/ k" B4 p. P+ B% v
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes# p: S# e3 J! j. W9 h8 t4 ~; m5 G
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
4 `4 _. G& J" u9 N9 \> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
5 J z& A3 Q! n4 r$ {3 N- a9 c& Z9 F> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.
/ ^0 O! Y* h' p, H
2 b' v! s' p H) J) b$ o0 ]2 u2 ?7 P提取语言数据:5 J- j4 I2 V2 Q$ t- O
======================
& ]" F7 ]. P, n- c- z5 R2 \> sfe l ; 帮助1 J& y) _3 b2 V8 v8 W
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
' ]- \. e7 q- L; i& p> sfe l src.bin 200 ; 显示 ID 200 的字符串* j* X$ a8 ^; {! {; x
> sfe l src.bin 200 2 ; 用第三种语言显示字符串2 J( T/ k3 k4 X/ R* J. i0 Q
> sfe l src.bin -1 ; 提取第二种语言2 Q: m! j9 j; g1 o- G
> sfe l src.bin -all ; 提取所有现存语言6 v% K0 j& Z* \" ], ^1 L8 w
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串; e i# t. T( {# j5 v' x/ y# e, e
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)" |1 M! y3 x8 C3 }9 @& y! _
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
& m* k" c6 c+ ~' w" c$ L, F1 A> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 ; ? t- ?6 v; D
> sfe l test.lng ; 检查test.lng 语言包& o5 W5 o! }$ e- x; i( z0 _
> sfe lc test.lng ; 检查和更正test.lng 语言包3 U5 l3 }5 ~% ]* c0 m: F- s
) A( k6 i. {/ ]7 s. e8 Z/ E" V
提取菜单:
7 w4 e! U0 r( s u& ?2 \ e/ k, @=============
7 A8 ?% e p% f( J# u, C f> sfe m ; 帮助
4 s8 Z, D: Y' U, |* k' g* ]> sfe m src.bin ; 提取菜单结构和入口, F7 c/ t/ ~5 x/ u/ w7 J& M/ F
9 d0 ~7 Q/ }& W0 C U+ q- T% |% ~! g+ E& T* M' P/ o I) }
补丁:% K, ~9 J! G6 |4 |6 X
=========
% B2 H6 a! v& a" Z- q7 W> sfe p ; 帮助 m0 m1 J4 D: q- S
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin; P0 t# a, W9 ~, R
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz$ x6 o) R7 l9 h7 p' v* p Y$ b5 {
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz $ t4 G$ p1 P' ]7 h d
( H6 T8 r$ M5 W: c. _/ {8 p
" ^1 Z3 a$ e& q6 [1 a9 S编译:
- J# u1 n% R5 _/ i3 [1 q- G==========: t- C7 j$ q, x1 G; k
> sfe a ; 帮助
! J/ ~* p1 f8 T D> sfe a src.asm ; 编译 src.asm
) v8 T/ Y2 H& v/ g2 C# ~$ Q> sfe a src.asm d ; 编译 src.asm, 完整输出 U5 N) q: D9 s' I
> sfe a "mov r12, #1234h" ; 单句编译
' N3 G* a# R! f4 @> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译- F$ x L) Z, k4 C; ?
> sfe a src.asm,TST ; src.asm编译成补丁格式$ ?5 E, j" Q( f; J
> sfe a src.asm,TST p ; src.asm编译成补丁格式5 c: X6 i# H" ?: r0 u
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
8 ^& O7 x" O9 A4 I> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000002 E1 Q; L; F. l6 S7 v$ o3 V8 A
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。: r/ \ q' V: y& C
$ l3 ^$ D! w% G5 t*) See Assembler Part to get more 'assembler' function detail" l$ R [; ?! S* l, s0 y: X* e1 p
' U. L/ T, @$ V% A
8 x7 x* D% F0 h* F3 v9 B8 j Q反汇编:+ q6 [6 m( S% [) w. b: f0 ?& O
=============
$ A$ O. D: r! C> sfe d ; 帮助
# @- ]$ s3 S' h. @/ u> sfe d src.bin ; 反汇编 src.bin
1 L0 A# M7 U6 Y' F, t> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
) {! B3 u S2 Q: v! `) ^4 k0 J; K> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节: K5 M0 {1 X, @1 H) y* X! {
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000& X+ ~8 B, N" u% S
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
* M4 y9 |! e+ Y) f. P, y> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
; J. }7 P. Q2 t> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件# P( W* h1 D0 j( K# i3 m1 M0 u
> sfe d image.bmp ; 单色图形汇编输出
* m q6 ~1 e. B# S7 q: O> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
! ~9 z0 j' f( {8 {# u
2 i& D d5 K* O9 f- `, Y调试:
2 q, _; O# V* y. ]; Q4 S2 a=========
. r/ h1 m$ c, p4 f' M> sfe r ; 帮助+ x/ V( ?! u$ e% ?. j9 C4 T
> sfe r src.bin ; 运行 src.bin
3 Z( p7 |1 _% W$ J- N# Y> sfe r src.asm ; 运行 src.asm 汇编文件
1 S, F4 a0 x6 S9 P- Q: Q> sfe r src.asm ,n ; 同上, 正常输出
9 |7 U) y5 k. u6 `/ ~> sfe r src.bin,200 ; 从 0x200 地址开始运行: G5 B$ A; K+ _+ G" S; k1 x2 {5 l0 ]
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
; c/ q4 ?9 o0 M0 A& G" |> sfe r src.bin b00000 ; 以 B00000 为基址运行0 v8 _/ v7 [ D+ T4 m2 U
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
* y" }( a3 M6 q6 Q. T s> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行) f4 z* V( f3 P
R0 x2 l5 c O: W
- O0 |8 \# m. Z6 b4 K# g交互调试:
$ `2 w3 w* u; E======================& _: C: }3 C6 v C
> h ; 帮助
: A% y4 F# r0 @' b: c: F U> g a00000 ; 到地址 a000003 K0 `1 k. @4 G6 u- L
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)5 s% k" V- x* i# W) E$ Y! r7 G
> d ; dump 内存 (现在地址)
" }% ?# F$ y0 g> d a00000 ; dump a00000 开始的内存7 P6 c7 \5 e" K7 W
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
6 W) k4 V5 v1 R3 M6 o> d r ; dump 注册1 m: d' S7 E1 c9 ~
> a ; 单句汇编
3 o) K6 E( ~+ a0 J( e> a c7d530 ; 单句汇编地址在 c7d530, l7 M0 g6 i: I7 i& ~* ?
> u ; 显示反汇编
# K3 u5 U, e6 V2 | }; a. V> u a00020 ; 显示地址 a00020的反汇编
3 Z2 ~1 \2 h$ }% k- B( t> r ; 在现在的地址上执行一条语句; E8 J7 b8 @ |4 B/ M
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
T1 _5 }' y3 Y2 {8 P8 J6 F) k- [- W> r 0 ; 运行到返回语句' s5 B8 u/ m2 a' x% J% i
> r -c7d580 ; 运行到地址 c7d580, F6 E( p6 b, Y* B, `
> q ; 退出" x0 V. b; c0 R( e+ Q) n. z7 Z4 c& \
3 d7 S+ q. d; {* P. l
*) 所有未声明的语句都会改变当前地址。
$ t: Q, \7 ]1 x3 C
* I) o H/ _' G u% i, g5 O
1 A3 i( P$ q V3 r% X特别的助记符: B- I9 C+ A% l3 P$ X. d
============================
) ^- A" W C, G$ @/ X*) 所有C166的汇编格式+ J! Q% [. J9 a$ ^) d) p6 `& U0 p
*) 分号用于注释 (在一行的任何地方)
) b% ] X; `/ O5 ?*) 特别的助记符如下 :
7 w4 Y1 V' p7 y" G# V- b #include filename ; 包含文件(各种定义)
& c, V- U1 g% _" b! K8 o* E1 S2 m9 F #define var value ; 设置替代变量 var = value+ v+ K9 B0 d( O# ?; y+ S
var equ value ; 变量取值 var = value
$ P" K! P7 `' ]* ?/ `. B$ {8 z# f db 'X',36h ; 定义 byte(s) 数据区
" c# j, {; L" U; |. q dw 1234h,0,'AB' ; 定义 word(s) 数据区% A9 ]" s& q5 Y& b9 C1 V
org ; 设定当前地址: |: V% \. ^ T: ]& o9 Z. S
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
; \* Q, \7 d0 n5 \( v# G end ; 结束记号
/ Z' ^, A' h+ Q1 \/ H# t ;#name XXX.string ; 定义补丁名称 (XXX), Q( \: ^$ M) v- J
' ; 注释将一起进入补丁
4 z; d4 [2 @# @: |1 v '' ; 注释将一起进入补丁,加回车) d+ e- h5 Y& z. s
'; ; 以下内容将全部是注释,直到出现 '' J5 u6 s+ P. x; U! z
;' ; 注释将一起进入补丁
/ Q/ C2 [ t) {4 X$ R + - * / % ; 加, 减, 乘, 除, 求模 操作
1 A9 M0 Q8 p/ O >> > < << ; 右移左移操作
( s+ l/ X/ Y) {% ]3 @% t & && | || ^ ^^ ; 与, 或, 与非操作$ v) w* C! c' j5 z: ^
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)! @- U+ D+ V8 [: g O/ T: {; o4 D
page(value),
0 }6 t+ Q& z7 w E( X8 x0 @ pag(value),
* @& u$ g7 l2 P( W5 p p(value) ; 页值 (= value / 0x4000)
) Y9 g9 D2 q% x! I- j' a) Z pof(value),* M+ ?3 I4 S# p
q(value) ; 页偏移值 (= value mod 0x4000)
6 X: d+ r$ Z0 ` a5 J) {& l segment(value),
+ ]& e, L C- e seg(value),- ~% E+ M' i3 U* c
s(value) ; 段值 (= value div 0xFFFF)
8 ]/ [ {$ n$ R8 y offset(value),
2 o# N3 Q& ]9 @0 d- R ofs(value),
& E" {1 ^# d8 C9 m8 ]) M sof(value),( b1 j4 \: U0 ^- G Y9 S8 N% K' q
o(value) ; 段偏移值 (= value mod 0xFFFF)8 P: y. `2 E7 T6 q) F N; D
! X$ L; P% _* |6 b# t
*) 例子:3 ?& h5 ^! J: a$ `1 P. n
8 r8 h9 K6 `; _3 H6 d i;--- Testing ---
( s6 ~& W- a, T/ F% z3 e, ?
+ I: h3 ^* X& m+ hbase 0A00000h ; 自动转换文件地址为 SL45 内存地址
; {' X8 V) d* y/ e% L2 J9 T8 D4 I' I8 W7 y4 P/ A7 W" k
#ifdef ME459 h* L3 J! A0 V. F
#include me45.inc
0 g! B* x6 b% A3 q7 O#else8 G* {4 {4 e8 D: g" K1 Q+ B" M
#include sl45.inc
1 _5 d; e$ j9 l6 |1 O4 Z e #define FreeRAM 37h:3600h& i4 j$ }: p3 }
#define memcpy 0c7b384h
6 ~' Z. j- x ^( g#endif
' |3 p5 W( g/ }: f& ~1 d" e5 ^) N4 J
" V2 v' z4 {' _8 |) C9 {1 a5 `;#name TST. Test Patch ; 补丁名/ x5 I9 V& t7 T0 Y6 Y( M
4 U4 Q& O; _. m7 b! h) Q
'Firmware : sl45v56
a$ i: m3 u, J' M3 |: y8 ?) W'Author : rizapn
7 z0 q! X; \- k1 T9 k'Updated : Aug 18, 2004
1 E3 d6 Y+ |) u
* g/ O0 j. i; B1 ^# c: Forg 0c7e000h
' T* q+ m' p0 D: q1 O: w: Q9 K mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移2 Z7 [7 J. F3 ?; V1 v2 }
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值2 ~ J' T* E2 p6 U/ g7 S
extp #p(data2), #1 ; 跳到 data2 页8 H. J. u9 ~( {1 A; Q
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
5 e3 ` w C, G* N* C callr sub_1 ; 页内调用
^- S/ y5 b8 b% x movb rl2, #'A' ; 得到 ASCII 码 'A'
! Q* [# D) R9 m1 ]( q9 I! \loop_1:
+ o$ e4 m2 Z9 i+ f& d9 b mov r2, #1234h
9 y( E& a8 h) P2 \7 Q9 X9 x/ W+ Y mov [-r0], r2
2 Q4 P; \3 o" u8 Z' v% q0 A4 M calls memcpy ; 调用段表示的子程序; H2 Q( n \5 L5 I! k
add r0, #2
" T) v3 y% U2 N1 } jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
& ] y B: v }, q$ w8 W rets
: Q, o f1 {$ U/ t9 k! [$ b) F" _1 `! N. e$ f
sub_1:, P) r1 h6 W5 L. C' }
mov r4, #1234h4 \; c7 P) x, X; S' S' _9 z
ret2 o( c# h# U6 n2 \# Y7 M
0 U4 f' X6 y2 _( z- R* h" G# a
data2:
+ h% w$ c. m; l% I' u7 d1 R db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
0 e/ A1 j7 |( d/ U2 |! n9 |$ d8 f+ N8 y8 h0 i% b; w$ w8 l6 Z
end
/ h- j4 I2 w$ b J0 N L% y& Q1 J0 a) u3 V0 o2 ~& X& X
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" u- F9 u( y) i* r# G2 J- t2 ^1 S" U$ R) v
Allaahu Akbar,
- s- D* \: z! p' v4 {- A! sRizaPN <rizapn@yahoo.com>
% V7 `7 u* x4 H$ ^5 c# ~) j: Y& Z; gJakarta - Indonesia
9 k! h6 F: F- r
+ |1 J1 s; |" X/ w* ^2 J[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|