- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
# V2 ^1 d2 z; f9 Q1 ]' O K
" v( H) e6 {1 Q简单帮助: h4 g$ Y& s8 _# U, x0 P0 z
====================
1 x6 o9 F- Y# I) a8 j*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。6 g' q8 F! j0 s7 r/ q
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
& v0 Z& y5 ~3 ]* D
2 y8 k5 T& r2 e9 P" W$ q2 t8 E* S% b( u- R) e
搜索空白区:
; b- R4 |0 }, f# ?8 q* E=====================
: l' r% n* j7 |' ~$ {- a> sfe 0 ; 帮助
9 a* d2 v; K3 @/ h3 Q! q( Z% t$ K> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)% m! H, I- ^/ E( n A0 S' u A/ b
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间( v7 G0 n/ b; w0 s+ [
$ y" u h! z8 l
二进制拷贝:! W! Y! H# ?/ U& O5 m% J' T( @% l
============) Z7 s4 b7 T5 x+ U& J& D
> sfe b ; 帮助' I0 H) X( W# r! G
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin: z! z$ j/ n+ z, M2 P S
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
6 n3 F2 ~5 F1 h' r: J> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin) Q& z- O% F5 r9 B' ]
> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200( o7 I8 f4 Y* v7 A# J1 U/ S+ C
4 x$ F, u& K9 t) z* {# n2 t比较文件:
! N# a/ I8 z- O3 ]" {& a7 J==============& `8 Q2 x" J5 r# A# _8 q" T
> sfe c ; 帮助7 b! J% T+ }9 V6 ?! z8 {
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
) L- K' _9 G4 o! q' s1 }> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )2 x+ J, l% ^- [" F. x/ p8 K$ F( T) B
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
. A7 [! v: \# \- b* t" Y3 a, x ]4 a> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )/ A; j& q, S5 s- `! c' d
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000$ Y9 c r9 e" M5 x: @
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
- ^& A7 @4 x" }8 d4 C) `2 ]( g> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)9 o6 g2 ?' ]+ `) h7 E
1 s4 B- W, w9 ^! @发现16进制的地方:0 Y, T, ?+ G6 h: G4 L& g* N$ W+ N
====================
{+ K( w4 s, g6 }8 c> sfe f ; 帮助
# _( W3 a( `$ j& R+ o" ]> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个* b1 ~1 o! L0 ]: `5 B" f# h
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
+ S/ Q0 H+ q: H: g$ [6 ]> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
4 O# {9 S: u, ]$ K> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找* S8 I: H1 q2 B+ \
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
. I/ y6 y8 F; G7 q> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes./ N' w2 n, ]; E/ I: Q
5 C4 a! ?9 M1 s0 d' C1 s+ ]
提取语言数据:
9 {9 H- R' q7 J* v6 \======================$ G* u n3 ^! ?0 A( q6 j
> sfe l ; 帮助6 c0 t& {! s# A" ^" j2 z
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
( M# t. Z. H0 V5 f1 p/ G( ?> sfe l src.bin 200 ; 显示 ID 200 的字符串
- {& {0 M- ^& u( M6 p+ H> sfe l src.bin 200 2 ; 用第三种语言显示字符串
! y/ w3 u3 c6 i- s% u> sfe l src.bin -1 ; 提取第二种语言) B" x: W& u6 g, X
> sfe l src.bin -all ; 提取所有现存语言, O6 z- F f: @( O8 j7 Y
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串2 r6 d, W% G; _( v& {
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
+ p, c$ ~. h, Q ^& A> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
- s& S+ X$ t8 f7 |: _8 n> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 3 d+ T2 W' y, B, k1 ]% c
> sfe l test.lng ; 检查test.lng 语言包
( W0 ]' N$ @( j( V> sfe lc test.lng ; 检查和更正test.lng 语言包
. M, H/ V0 Y( R2 h: b& |6 k" D* i. d2 m: S1 d! ?
提取菜单:$ P! X ]* f* ^- D' A5 ]! N, W0 B0 I
=============
1 G( m/ Y5 g& X% ~7 f1 x$ p3 }> sfe m ; 帮助6 S8 }; z. W6 b; W j# H) Z+ D
> sfe m src.bin ; 提取菜单结构和入口" a! K G2 Q6 `+ q7 [
' p+ M S6 k. ?4 @2 X& ^# c
9 c4 K/ X& C4 D! D0 h3 V/ O补丁:
& M' I3 q& _" h=========
8 Q+ P& J$ p8 ~9 n> sfe p ; 帮助
2 V3 x& k0 n2 F" U t2 X> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin4 h5 m2 C0 {8 ?, l# M/ U/ `
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
' H5 m0 R, X" z( r> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
0 w+ z2 @* X; `0 C) a$ B
) V$ y" P: U# D8 ?
" J4 L0 X8 V. K# z) l) l编译:
5 R# Y3 f/ I) a% v) q==========
4 {0 T- I; m. z8 ?& }> sfe a ; 帮助
- O f9 {& F( O7 K* S7 j* @9 F> sfe a src.asm ; 编译 src.asm
3 K& _7 E3 u* m6 m$ \. d' l> sfe a src.asm d ; 编译 src.asm, 完整输出
, b( U6 w n1 \1 s> sfe a "mov r12, #1234h" ; 单句编译
6 [- Y5 v" l3 n# N, i1 V> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译+ Y( g+ n6 h: |$ d
> sfe a src.asm,TST ; src.asm编译成补丁格式6 d3 M& L [! v. O4 R3 R
> sfe a src.asm,TST p ; src.asm编译成补丁格式
, ], G8 w W! n$ z' F- t, @> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
6 }0 P2 N, U" h5 T/ i! u7 a( I" ?> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000+ T) l; b. F/ P; Y
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。% n4 U! B% Y* L) l; A5 \
& q- R3 P" y3 _& h/ F
*) See Assembler Part to get more 'assembler' function detail* I4 z) ?! Y2 A3 b3 B+ ?
! B) ]/ o i* ~' U3 }. a
- H; [, g- q1 g/ F/ u反汇编:
9 ~3 j" Z7 W, F/ y=============
" e- J# G6 t$ c> sfe d ; 帮助
4 I; ~# J( p' S0 I( t> sfe d src.bin ; 反汇编 src.bin [ v' `2 ~+ [% {
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin* E( R. T# j+ T/ w" @
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
* J$ F8 ?$ E5 K, o. V5 u9 j> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A000006 s4 A7 U7 z0 {, T6 H$ A, t; `3 F
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止 f+ a U8 @- ~* C8 Z7 A
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址: O# m" i6 W8 m x3 y3 d
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件' p+ r% ` c/ t1 P! W
> sfe d image.bmp ; 单色图形汇编输出
* a* |+ O2 t, J1 M+ q6 [* e> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
" M1 T; e$ Y q& d, y; s
" X) _1 `0 {! k' Y调试:
) t( e$ T9 H0 J. c l=========, f4 x" ^- v7 K. H4 i/ \: ?# a& z
> sfe r ; 帮助
5 T; o8 P, |' h# N2 O- ~- J& B! G> sfe r src.bin ; 运行 src.bin
8 N# M! @7 h6 d) z7 \ Q> sfe r src.asm ; 运行 src.asm 汇编文件0 s! B, i, ~" D8 D! R1 T+ o
> sfe r src.asm ,n ; 同上, 正常输出
G6 N( e$ @! l> sfe r src.bin,200 ; 从 0x200 地址开始运行
4 F) d. E) [& E8 L; N* ~! n- A0 `- H> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200 h4 _( _* l& M& e& U9 {1 h. _
> sfe r src.bin b00000 ; 以 B00000 为基址运行
6 {/ _+ t, o4 S; ^. u. {> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
) R# r) d" n' f( g> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
. s' P4 W2 [" Y) T0 r- g3 D2 q' z( \, U) k% i
3 s/ F4 [7 \* ]0 L- }* Z6 ^
交互调试:
' k) g0 T1 H7 ^9 g# f======================3 k6 x+ m& l: S- K6 U- L
> h ; 帮助+ P% T( z. B+ E3 x
> g a00000 ; 到地址 a00000
w) _8 w, G( p5 Y2 H> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
2 [3 _+ f' t, A, t- J7 R1 K2 z0 V> d ; dump 内存 (现在地址)
9 b0 d4 U$ ~& w> d a00000 ; dump a00000 开始的内存
# j0 P) e- M8 `. a5 H8 h) X6 T> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
3 F( _* |$ t6 p8 P' P8 ] E; g> d r ; dump 注册/ Y4 `/ Z" M- a; L3 x+ H% Z2 J- n+ t3 r4 H6 s
> a ; 单句汇编
3 h+ N, }/ m. U$ T$ A& _: ?> a c7d530 ; 单句汇编地址在 c7d530
) f% D5 i7 E2 |7 N$ [> u ; 显示反汇编) G% E: i5 w+ k' r5 c# @/ K
> u a00020 ; 显示地址 a00020的反汇编
$ e- P( N% m( j/ k' L: S! z# k> r ; 在现在的地址上执行一条语句
1 z8 K' A+ z1 h* z! ]# f" M! s. i> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
) _$ @" \1 G4 O3 G" v' _> r 0 ; 运行到返回语句& D. Y! z+ k0 i
> r -c7d580 ; 运行到地址 c7d580
; p6 g) T! M- Z4 Y> q ; 退出
( }: e/ S% v/ R4 } m; ~# _' T
" i: ]* i- |8 y6 W0 `% s& S*) 所有未声明的语句都会改变当前地址。1 a3 l" a. P- d. m5 B$ h" u
, Y: g0 H! v# c0 E' |4 u! X
* Y- i( o* D0 Y% A7 b特别的助记符:) e/ s3 i9 X9 c0 U
============================
% A) L& e4 T8 [; G5 G0 ~*) 所有C166的汇编格式 O# u! p E5 }0 L* h" {
*) 分号用于注释 (在一行的任何地方): h8 O; q) g2 ^4 l" n3 H2 A7 O
*) 特别的助记符如下 :
8 `0 }# W0 W o7 o #include filename ; 包含文件(各种定义)* G* j* h3 q- H( ` o) F) Q
#define var value ; 设置替代变量 var = value/ \" `5 M$ v4 G
var equ value ; 变量取值 var = value {7 B1 N7 R$ \) z2 E0 f
db 'X',36h ; 定义 byte(s) 数据区
9 L2 _: ?3 W g dw 1234h,0,'AB' ; 定义 word(s) 数据区
' c% q3 Q, e+ _; \$ T5 D/ j org ; 设定当前地址" @/ _' h' x/ }; r" X
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)5 X/ N, D: }/ k$ d
end ; 结束记号
9 K/ @6 n+ w0 s: \% S/ O4 o ;#name XXX.string ; 定义补丁名称 (XXX)
% z9 p5 A: F, k3 _9 F0 \6 Y+ ? ' ; 注释将一起进入补丁
9 l$ B% |" n8 M6 n; F7 F( R '' ; 注释将一起进入补丁,加回车# Z; s& [" z/ ^6 A q: @) }
'; ; 以下内容将全部是注释,直到出现 ''
$ V$ a2 e( S4 s ;' ; 注释将一起进入补丁2 E3 q% }5 t% i1 z+ t3 c
+ - * / % ; 加, 减, 乘, 除, 求模 操作
: u) a3 h! D7 q! t! } >> > < << ; 右移左移操作
+ e$ G- y$ `2 b6 P- n7 s7 | & && | || ^ ^^ ; 与, 或, 与非操作 Z" T0 F* |% y8 j5 r
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
# {6 a. F' _# b2 [% x* f page(value),
& i3 W; y4 ?9 l( d( O pag(value),
4 b- ^% Q: a7 ?5 J p(value) ; 页值 (= value / 0x4000). [, i" Y' l: p4 W: t' e
pof(value),
9 ~, J* c8 f; W! P. X5 ~ q(value) ; 页偏移值 (= value mod 0x4000)0 h3 B& F2 N9 X6 b+ {. }6 y1 G
segment(value),: m, p' k$ h% J$ S/ ?+ N
seg(value),- N( B. x/ w) ~5 ~
s(value) ; 段值 (= value div 0xFFFF)/ B v' u0 t9 P* N2 f! g; u1 D" F
offset(value),0 M3 c) ~- g* D6 B" s
ofs(value),
# t9 f4 _- q& S$ M) h sof(value),
/ v% _8 n' e' g7 ~ o(value) ; 段偏移值 (= value mod 0xFFFF)) `+ V% u( y5 D0 O5 J
4 r2 }# a' |" l* `, o8 |: ]*) 例子:
2 O! z+ d; v4 _8 x5 \ F9 f2 A0 j- k- k9 n. ]5 i
;--- Testing ---7 D8 k6 S0 J2 c7 W
, \9 ^6 s, L( c0 [. A# ]base 0A00000h ; 自动转换文件地址为 SL45 内存地址
: {+ X4 g+ _1 h7 {- Y! y! Q; u3 S
5 l8 X8 U; @3 r1 G5 _ O#ifdef ME45
$ Q8 `" p! ~" \$ y #include me45.inc8 Q' k- C( k9 [0 i+ X& {$ i
#else% r# w2 U0 U9 e' j% \# R# k5 q! M
#include sl45.inc: s) D, L! G% h0 v7 ]3 Y" @/ F4 l7 U
#define FreeRAM 37h:3600h! ^7 J2 {! O" C1 g
#define memcpy 0c7b384h( B, U% _; n4 o4 i, u9 e5 a# {/ q
#endif5 m% a$ h2 y* L; G
3 D# P$ f- s" z0 X;#name TST. Test Patch ; 补丁名
/ b, K8 I, {9 z* X# L [" z7 r- R% D8 V! I
' O S% h& R2 l. H2 m: ^$ a'Firmware : sl45v56
' j8 O. D% |7 o2 w: K'Author : rizapn' L! c8 s" M( M) R
'Updated : Aug 18, 2004; @7 d# J: W+ @3 f5 y/ i) x2 q
0 \" o. R% O* U$ ?/ r5 ~& i3 g
org 0c7e000h; Z9 Y# _ r$ h6 h% ]% G8 d3 C
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
; T" U- k0 J: C mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
u2 o7 r5 I) D6 W- g extp #p(data2), #1 ; 跳到 data2 页
( V$ m8 E7 ^- L: {. w% x8 p movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
6 T7 g6 ]3 O- k5 U* {) f callr sub_1 ; 页内调用2 {0 ?0 C4 U. a) g; n0 e
movb rl2, #'A' ; 得到 ASCII 码 'A'3 x% N, r) O- C3 N) a+ ^7 E) a) `
loop_1:; E3 u7 Y; x ~" X7 ^
mov r2, #1234h, t9 e/ N0 Q9 t" Y2 S. T' }
mov [-r0], r2
- [' ]# z7 N% N3 \# K+ }. G2 K calls memcpy ; 调用段表示的子程序, V5 P! S! J8 y/ x# S
add r0, #2% ]7 _6 T0 N/ y9 n5 R" J
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
- j5 i0 p8 ?9 X rets! M$ \4 m3 p) f1 A/ }1 q
# ^! \' j8 S$ F5 |& K
sub_1:4 G6 Y1 T- }/ V% B5 M, l& ]" B" ~7 Q
mov r4, #1234h) ~; P; v _* c
ret0 x3 d2 v9 J( h5 Y- r* w0 x9 F
& _' m# B( o4 C/ |
data2:
" i8 s! i9 R+ u db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
' [8 K a/ _: [ n
) Z+ I8 b( n0 Z/ pend/ {. N/ \# o( X0 ~5 L B1 G3 \
! Q& ^5 K0 Y0 z+ }* h;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- a8 U8 Y, N. h% z0 [- l/ e1 Y L E' n" I; T$ m; d# ^1 G
Allaahu Akbar,! c& P' c9 `0 t# H! ~% Z) F
RizaPN <rizapn@yahoo.com>
4 @( `# v1 o* ]' {/ [Jakarta - Indonesia H/ m/ I& {- b1 }7 y0 t, V1 m" `4 N
0 C# O0 L# \7 P) M: e' r j[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|