- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
0 q4 u8 H7 S4 X* K9 `% p' P& l9 H' I; p2 M. T: X
简单帮助:, n/ A3 l0 S, _" w
====================
H% |2 I% R$ ^3 M" [$ r*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
) _# L6 N* ]& u0 S*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助./ O' g! t" j) S
3 i$ q3 S" c' `8 T: P) _& H% O1 j, O# m( ?& e
搜索空白区:
8 C" w8 K! v+ d3 @& K2 d9 Y=====================- \- J7 n& \5 ^' c: @5 @. ^
> sfe 0 ; 帮助# z1 B: b0 V/ S) w" J1 x
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
, R5 V; m1 ~" m4 R, E# U> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
& d: B5 D% a( Y2 J; s7 ^3 f" F, P3 _! n/ y
二进制拷贝:+ j( C& A8 n1 H5 v9 K# e! P1 g+ {7 }& e8 Y
============
/ Z! j) q7 b+ X> sfe b ; 帮助
, W, L; J# V( P9 j( {> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin5 X7 p- G# w0 `( N7 H# A; F; N
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin1 L) S( ?" ?) L$ C, [
> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin. K+ e+ L( [" m: K
> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200! `5 R3 q1 |/ q3 H$ G! o+ ~& {+ f
/ i8 m7 u3 E% Y$ T7 K比较文件:
0 w E8 B3 e3 G* g) i==============
, `: G+ D" `' B( Q: k6 H8 [> sfe c ; 帮助9 K% X# k% ?5 t" o
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
; x$ m+ T4 f+ v+ J. I2 i> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
2 P7 E7 R' L& ~> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes s" L4 e' w ]- ~" p
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 ). D+ y. m7 l( P# ]' j
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
+ p+ B% w" S, J* a+ ]> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
& H9 J% Q, L+ n' V1 U( q> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)/ z. f5 B6 i" y- G
7 w, B' ]) i H% Y- p6 {7 K6 w( |
发现16进制的地方:) c3 e/ k0 m1 u; k; m' H" E
====================' s7 |; T% Y: v; J6 X1 D8 H9 D
> sfe f ; 帮助" B$ b+ z a8 P1 q/ }
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个+ t- h. h7 s9 ?3 ~
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
1 G2 s; m' @! Y& e9 D> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
$ R2 T: ]$ V- Y' Z$ D) U- s) z> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
+ x; c6 w$ P, X+ {0 {* t- w+ o7 o> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小' A# I7 n( M7 t( y% s* W/ z6 E+ y" F
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.
. O4 ^3 }; V: D( W1 B D: e: {
0 \! v: Y6 c: I$ X提取语言数据:
% D$ K# }- |' B. P/ T======================6 Z; R4 k! a8 C" s2 E1 J# D
> sfe l ; 帮助" C9 `- G5 u1 Y0 b" a
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
0 J- E& ^0 ^4 _* G P> sfe l src.bin 200 ; 显示 ID 200 的字符串+ {1 M) }. m0 m* L2 H4 o! ]
> sfe l src.bin 200 2 ; 用第三种语言显示字符串
$ |! ^1 u2 g5 u5 M" Y( L% V6 E> sfe l src.bin -1 ; 提取第二种语言2 q H# d7 ^0 y1 [$ N v5 K
> sfe l src.bin -all ; 提取所有现存语言9 I4 L3 h: r' J# ]
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
; x% T7 H+ P7 c1 M> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)) T0 j4 N( \# l* R
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
|) G: x& ~2 O2 b$ @) Q6 b> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
! ?% c* h. P3 u7 \2 M, v5 y" H2 D: }> sfe l test.lng ; 检查test.lng 语言包# Q" S. K9 Y H1 I
> sfe lc test.lng ; 检查和更正test.lng 语言包 m) u& {2 V: Q" P# A- a
. w$ H: S1 w6 l8 q提取菜单:0 b1 ?* r' r, R
=============
2 X' I7 x. ]5 _( O& ?8 N% L. t> sfe m ; 帮助5 `, { y" z7 X6 |/ i# R, o
> sfe m src.bin ; 提取菜单结构和入口2 v+ r. w( {: E9 H
7 `* x8 l2 n3 Q3 g
, g% g5 p8 \( q4 d5 q+ R
补丁:1 x8 q0 i) b7 u
=========, A, w! t$ }# d7 ~. P$ i# S& `. R' b
> sfe p ; 帮助
! n) ~3 Q& R! R3 w, S B5 ^> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
. J8 @+ h; z& Q, }% r) j> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz/ T( b# z5 a7 K- n: c+ D( ]- a
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
& }) l3 f. B3 M* E8 c. z) ]6 w+ T3 c8 v: t1 q2 `. @6 L" E5 V
% o+ \. y, c# \& W9 ?, ~1 u/ L编译:
6 P: _# ~5 |! d5 K; `==========* G7 o' N/ W3 {, }5 T1 I
> sfe a ; 帮助0 t0 `/ @7 N1 a/ k
> sfe a src.asm ; 编译 src.asm7 [' |5 t: p8 s( }6 }3 s
> sfe a src.asm d ; 编译 src.asm, 完整输出
9 X) f; w6 v- }0 m$ c> sfe a "mov r12, #1234h" ; 单句编译! ~9 r; \9 J) d, }
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译 s1 J; z7 N# G# Q* Z% L4 A
> sfe a src.asm,TST ; src.asm编译成补丁格式
+ K: J: U5 C* T) i- C& ^> sfe a src.asm,TST p ; src.asm编译成补丁格式
( l6 ^- I! M& l3 n+ q> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
% y" t' z8 @+ ^$ b> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
% M7 P/ L5 ?) ? L> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
, u& [- }& \4 C9 B N9 t% b: b/ T+ e) p$ C
*) See Assembler Part to get more 'assembler' function detail
% _1 G* v- L- d" ^' b: r& H* O! Q7 q; p1 `( S- h3 C
( P, n# v4 C% n; \
反汇编:
1 X+ a+ R( q( W0 D' y& n* ~# G=============
- ~1 Z) p4 w- ]. w> sfe d ; 帮助
2 S0 f9 F$ F7 m- K- p) \> sfe d src.bin ; 反汇编 src.bin
2 g% w- E L# \# R> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
8 ?% y, k1 Q( q. U. Y, U> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
$ |& {3 N5 {* y- {/ ]6 c; G> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A000007 j8 |6 L1 E+ q3 x
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止+ b% S) A9 M( z
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址$ ]' I8 W0 V9 D# |
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
8 S3 s# q# Z e" E; V1 u> sfe d image.bmp ; 单色图形汇编输出1 b: T0 _3 t& U) a
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
/ E$ F. B# E( R6 S: j: _# y* V8 l' c* E3 A5 A
调试:+ M$ N; @, m4 h" w
=========
0 f) B! b& g4 |* v/ I> sfe r ; 帮助
3 l: `7 i# Q7 r7 V3 X# x: {3 P> sfe r src.bin ; 运行 src.bin! a, ~/ M0 m; d) x: ^3 o" J
> sfe r src.asm ; 运行 src.asm 汇编文件' Z' B8 _; G, q
> sfe r src.asm ,n ; 同上, 正常输出
5 Q0 t* D `9 Z$ G i> sfe r src.bin,200 ; 从 0x200 地址开始运行, v7 l) d$ }. \7 Q/ s+ X4 Z
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
( t' n8 @% E' M' O4 X/ t> sfe r src.bin b00000 ; 以 B00000 为基址运行5 z0 ^+ a( M7 b5 z
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
. Y( O1 f, _; }! g> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
, i0 `' N2 f9 J6 O6 Z; a. h8 C( m' M
# [8 s2 ^8 r. w. X# V5 q- ]$ N5 o6 w5 q9 a" T, ~
交互调试:# Q5 N) k2 t- y2 c- P& O" f
======================# Y i# {: K* D! O" j" v
> h ; 帮助2 V* w/ e3 ~: J, I2 g! p" s
> g a00000 ; 到地址 a00000# ^( @# e0 i1 R) W' t
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)) E! v6 s2 [$ j' ?& y
> d ; dump 内存 (现在地址)/ \% V' \- K! S) I
> d a00000 ; dump a00000 开始的内存3 S' T$ m* ]( i0 u7 o( Y
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
" d+ {$ A$ f E9 m9 G( q4 X+ \> d r ; dump 注册6 Z" x1 Z: S5 Z) g! G" P z9 r: G
> a ; 单句汇编5 G" t) C% R" h( X) b9 u* Q/ E/ [5 e
> a c7d530 ; 单句汇编地址在 c7d530
$ h* v: F. d1 m- j* e4 r> u ; 显示反汇编
% A# r! P/ ? {0 q- h> u a00020 ; 显示地址 a00020的反汇编
( z& k- u8 O4 W2 ^9 \9 l/ j, C> r ; 在现在的地址上执行一条语句
( c* N! y: |1 K: ~> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
8 {7 P* i2 {0 q> r 0 ; 运行到返回语句6 X( D9 ^( J: s# R
> r -c7d580 ; 运行到地址 c7d5802 N) w ?+ \4 Q# r2 r
> q ; 退出
5 q# ]0 R; O4 p& O; n/ \, ^( X# Z i/ z) f4 l) F8 ^0 _! J
*) 所有未声明的语句都会改变当前地址。
$ O6 C0 E; R7 [1 R2 z0 F& V
9 S9 f! ?& _) a3 c9 z; D- {' ^" E
$ o! M' ?: }) S+ z: ?) ?2 S特别的助记符:; l* R+ u P& g& @0 n8 U% i3 H, I/ p& g
============================
: ^# _7 c3 M; E: t. O2 X*) 所有C166的汇编格式. Q6 c* Z+ h0 T+ R% C/ ^1 K
*) 分号用于注释 (在一行的任何地方)+ {+ o3 ]& w" ^% X, u. g; ~
*) 特别的助记符如下 :5 K2 Y! ?" o2 P+ [) z
#include filename ; 包含文件(各种定义)' m7 P8 W& |. _0 m( P- p
#define var value ; 设置替代变量 var = value4 I1 Z$ E; I; U7 N
var equ value ; 变量取值 var = value4 x; @8 W$ l3 P" Z
db 'X',36h ; 定义 byte(s) 数据区9 Q: t$ \- g6 Z0 p* x1 g
dw 1234h,0,'AB' ; 定义 word(s) 数据区
8 V( K% h Q% u& [$ w org ; 设定当前地址
9 U6 u4 d [! f& t base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
& t4 ^* C; r! v0 \& V end ; 结束记号' _! j9 [ \( E8 \2 |1 \! W9 i
;#name XXX.string ; 定义补丁名称 (XXX)
/ s# A' D; Z% J% x @4 k" O9 n' y ' ; 注释将一起进入补丁" s, {1 C; d8 [
'' ; 注释将一起进入补丁,加回车
5 @1 |4 _! [/ V' m' M, s. D '; ; 以下内容将全部是注释,直到出现 ''$ s& P9 ?( i) F+ D4 }
;' ; 注释将一起进入补丁4 _, p+ f4 d: {$ V1 }: e* m' t
+ - * / % ; 加, 减, 乘, 除, 求模 操作$ W* F1 e% @0 c7 A$ G
>> > < << ; 右移左移操作
6 w' t! s' w8 U# Q. Z & && | || ^ ^^ ; 与, 或, 与非操作. N' z7 E9 Q+ u" U$ J
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2): U/ Y7 V4 S) c4 x% e# v
page(value), , O& ?6 A/ _+ X) n8 h
pag(value),' e" W; z1 S z- ]
p(value) ; 页值 (= value / 0x4000)7 r5 v* J6 q: L% Z: J
pof(value),
* j. `6 e- |- l; F q(value) ; 页偏移值 (= value mod 0x4000)9 g: k# b4 p# U3 l# u
segment(value),5 x/ z% l- H2 k' f1 m
seg(value),: B. `4 u9 ~* T+ F! s
s(value) ; 段值 (= value div 0xFFFF): ^7 O3 d9 w( E9 b% z! |- I' z' C
offset(value),
7 p1 y) Q/ v: J" | ofs(value),! O) e( e- ], t
sof(value),
; h) @7 a+ o u8 R( @ o(value) ; 段偏移值 (= value mod 0xFFFF)) Y9 N Z7 E2 X' E. Y8 C; P
6 E/ C9 ^; S- ^* u, k*) 例子:5 `3 y3 p$ l' a* S# |% J3 D8 v
* }) t- _ B8 @9 c& m7 p8 ^. ~;--- Testing ---
! j3 g, k5 q2 @8 F# z$ D$ Q4 y) X* X% k) W/ M' ~! P2 D
base 0A00000h ; 自动转换文件地址为 SL45 内存地址
' H* s! p2 j; e' e, [
7 @" n1 k' W: F- `& k9 ]3 Y#ifdef ME45
# [# K1 O3 ]/ C #include me45.inc$ T3 a6 o6 u) C
#else/ r: N9 z7 X* a# }, R
#include sl45.inc" c- a3 K8 a1 D W6 B
#define FreeRAM 37h:3600h
- `, P! n% z6 E7 R% c$ e* O #define memcpy 0c7b384h
0 `0 I3 r1 s8 w3 t$ U#endif
0 J# p) _1 b- J- S7 u- V) v4 N" _! a. O- B% V! T6 e
;#name TST. Test Patch ; 补丁名$ L6 z7 f7 N1 I' L8 s+ t
( T$ j( }: |( E" c9 }2 o. A
'Firmware : sl45v56$ y* q$ B3 @; k" a+ |
'Author : rizapn
. p, H) i: y: v: I'Updated : Aug 18, 2004* `7 k, O6 _$ f2 ]; j! K
X( ]0 I4 T. E: y7 g
org 0c7e000h! L; z& U% R' X7 ?# Y% { W
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移9 J) K! R/ T! A
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
; ~; e: V! I4 I/ k: ?) M! \8 z* e extp #p(data2), #1 ; 跳到 data2 页3 a! O7 }7 i: T- V P) b5 t5 _
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
/ H9 V" U, Q7 I- z( X callr sub_1 ; 页内调用' Y* s$ b2 _$ M
movb rl2, #'A' ; 得到 ASCII 码 'A'
6 g4 d5 u$ }4 J6 ~% N5 }9 _loop_1:
2 ]) E3 [( N5 R# y7 U% B# f mov r2, #1234h
* F6 [+ [% l+ A" o. {8 B+ W, `& z mov [-r0], r2
7 P# y3 J, @& S calls memcpy ; 调用段表示的子程序
q8 k3 Y( ?( l8 Y4 c" Z4 ]: m add r0, #2
! P5 o; ^3 x9 Y5 P jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处5 S$ r8 g. B+ Z2 H/ L8 c- [( v
rets3 c. f) `/ a0 K
- |9 f, j" F: ~! n" rsub_1:- I6 J0 J' R* i4 z
mov r4, #1234h7 D2 y; H& U3 w7 o1 O
ret: |: y+ L; q: i3 x ]+ C- X, {! y
9 H, Q3 F. e) G* e5 Qdata2:9 m @) N3 F; N2 ^$ \
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区8 h; K( {9 V2 M* ^9 O+ [
4 n, W# N, b" C% A# }& d
end! {, X( Z8 j# @5 C1 p1 Y- G
2 ^( C( S1 ~+ D$ v;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~% Z0 u) Q$ l) y8 I! x% W
( h; R4 b& I' O2 ~Allaahu Akbar,
% j& o6 Y, X3 s+ FRizaPN <rizapn@yahoo.com>
$ e; ]1 K, m" u8 L- E# j. j! t2 RJakarta - Indonesia. {* W% O q6 p9 _) L
9 b* M9 `8 ]2 @' z! h3 t5 X[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|