- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
2 P n4 x4 S: D/ D4 s8 F" R2 t/ h- b& Q8 q' j% G$ f6 z$ L5 Q8 h Q
简单帮助:. h \1 a( g$ F; ^
====================7 I* R' z, q( ?6 Z1 r
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
! Y- s6 X( H# @7 C) t0 s*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.$ E& H" J1 V7 z7 L1 e8 ]
; z' e# V* b; c# o0 o
, e0 M" \. T9 U# {2 \搜索空白区:
& K/ D+ o2 L0 ^: ]* X$ U# \6 g=====================# v' f3 P+ M0 n* ?4 X9 Y* C5 @
> sfe 0 ; 帮助 X4 y/ e. f- L0 ~- ]
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)! Y5 @1 _* }; V7 S* Z; u
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间& ^8 K+ } T+ y
& r; d* {' z) ?9 {8 k n4 L) j
二进制拷贝:# d! O) O, [1 b3 S! A
============
$ S1 L( L v: C$ S- I$ {> sfe b ; 帮助( F* W$ }8 B; d- ]2 v- M0 h8 \
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin" d5 H) o8 Z7 s) t' r& l: O0 z0 H
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
. r9 ?8 z+ M* M7 l6 F> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
- v" X1 j e& [> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200+ X$ V1 z$ u4 V5 X/ y
; F8 J3 o: t1 |+ M8 H; k7 e比较文件:9 R( S$ n, \6 [* \& S! E
==============9 W; x/ l0 n! _3 }! Z/ r9 o% e; c* e
> sfe c ; 帮助
/ |: m! Q/ F. ?+ E8 Y> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin M7 Q% ?: x/ S( M8 Y
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
! u' G" o u0 q6 C# b> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
% y! p- P9 N) ^! _ P$ Y> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )1 g( r" v. {7 T* n- N7 h2 Q. u, i1 ~
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
6 J- O6 p8 I; n9 m) O$ q: A> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
f6 h, D8 \. C' |4 z> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)6 D5 |( z3 r+ w0 X6 C
. I9 I: _9 K, d. B b$ j
发现16进制的地方:
5 z! j$ |, [2 Z! \8 T" c3 P====================
6 _% ~7 M0 P) G+ }# l> sfe f ; 帮助
5 q/ }+ Y, L+ t# Y- N> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个4 V& Y* D5 x# s
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找0 F% T- h$ ?. ~- s
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes# p% o) k @, n F+ z% Q( Q# F$ B
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找& F9 P! B3 d- f/ _; G3 P$ f
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小 P3 t M0 v7 \# U: k! m# T1 W
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes." n$ U" e# X) W" K
$ M! U: g; w/ o7 |0 C8 l- R. |
提取语言数据:
$ T% g$ b4 Y4 I; g+ O3 M! D! x======================3 e/ s1 a" O+ A$ k
> sfe l ; 帮助
6 b8 ^2 `/ E, v. K> sfe l src.bin ; 提取第一种语言,包括扩展文本数据0 k, y8 J1 F' k [5 w8 K4 T
> sfe l src.bin 200 ; 显示 ID 200 的字符串
, o3 y' d, m1 }> sfe l src.bin 200 2 ; 用第三种语言显示字符串
0 k% P% U* B: `> sfe l src.bin -1 ; 提取第二种语言9 F1 |3 D5 o& N7 s- z5 R) X. R4 Z% y
> sfe l src.bin -all ; 提取所有现存语言
) M- G9 }2 f3 N! O> sfe l src.bin 'Testing ; 转换 'Testing' 字符串1 m) G! ^( f" T; p2 u1 f2 I8 {* G
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
, i( W* x& ~0 g> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
. r0 y2 s! _% u5 {> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
' {! e3 m$ O# ^, |) B7 Y5 ^> sfe l test.lng ; 检查test.lng 语言包4 E0 \+ ~/ X$ U: A, u3 z6 i# x
> sfe lc test.lng ; 检查和更正test.lng 语言包+ K4 F' Z3 B: K
+ b1 } Q, l5 {
提取菜单:: D: \5 a. a% r$ z+ C7 F/ ?2 w5 Y/ e
=============; q F+ I: z% g) [0 |4 e
> sfe m ; 帮助
, h( V$ L( |0 j0 i4 A5 E. t3 h> sfe m src.bin ; 提取菜单结构和入口6 i" R* n- _7 r2 e' O
' R/ A2 c. }6 [& o8 Q- `/ [: l% [
- J9 d7 H. f7 b4 t+ P
补丁:
2 W" R$ V( E* c7 F2 s+ [9 [0 S' o7 d=========
3 v6 L9 ]2 V7 }; u. O> sfe p ; 帮助* I2 o$ [ r; A& P6 F( p1 @
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin5 h/ V3 k2 g; }% Q( l% @9 B- s
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz7 U4 Z' ` }1 Z/ [, @% v9 R+ L
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
/ X8 M* w! g; E# s$ S4 w, `$ w6 w% f: R! `' a# K
2 J8 k | C2 Y0 Z) Y/ ?; @编译:# S7 ?8 r! ?$ `
==========
) p- Y( } v/ w0 \* P> sfe a ; 帮助* o; K1 o' _. r3 x1 J
> sfe a src.asm ; 编译 src.asm
4 W5 b6 r9 y0 P+ [> sfe a src.asm d ; 编译 src.asm, 完整输出
+ ^7 X7 W" l; O7 ^- o! W- [* c> sfe a "mov r12, #1234h" ; 单句编译
, q. L! M! G. F0 K( y3 L3 \> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译6 o8 W& j6 A3 w" R7 m- e7 \7 m+ Z
> sfe a src.asm,TST ; src.asm编译成补丁格式
4 P4 i7 x6 P" A* B, j, N> sfe a src.asm,TST p ; src.asm编译成补丁格式+ o* u# k/ j, y! ?. a$ p
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
1 a9 p. U/ y7 ] D) O> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
/ L' W) o4 \0 T3 ^0 O> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
- C9 u& U! I; w( ]- d/ g0 \$ S' V' U- p# A* X# L/ p
*) See Assembler Part to get more 'assembler' function detail
6 q$ t1 H. x0 a+ ^3 m) \$ p: ^9 D+ C& H7 Q. o* t& m, q% C
" g% ]" d$ p' B3 b
反汇编:
* V4 m1 ~* @, a; v1 q4 }+ t=============' W( C9 G: y" f7 N' ]! R
> sfe d ; 帮助
1 S: G, G" e: h: \> sfe d src.bin ; 反汇编 src.bin
9 P5 n& M1 x6 V# B( G" ~5 x. E> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
/ S% t. T2 E0 D3 y> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节! z* d1 I( c% O ^7 }3 n
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000
8 G* u8 d+ ^8 o+ V6 q; f) E> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止, \5 t" W- }% {5 I: \0 ^7 ~# K
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
1 A0 ^% g; T# M0 p8 x0 j" m! h> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件! u( U: M3 j* l8 N+ _0 t
> sfe d image.bmp ; 单色图形汇编输出
2 {3 W% l8 i2 @9 [> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。: f* Y2 [) h, S C# F7 `" t, Z
7 d) _/ }/ q0 K# e+ e调试:
3 ^6 h6 c( k+ z9 S N=========1 ?, Z# B* V6 h5 i" S8 x
> sfe r ; 帮助; ~0 U- o! [4 V( ]
> sfe r src.bin ; 运行 src.bin
$ U" E( m& k0 d3 A, d> sfe r src.asm ; 运行 src.asm 汇编文件4 }& W- F) J" Y q ^# [( T, w
> sfe r src.asm ,n ; 同上, 正常输出0 L& W: f' Q) }
> sfe r src.bin,200 ; 从 0x200 地址开始运行8 M" p1 Z% h _
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200' O( L: n Z5 m# B3 ~2 q
> sfe r src.bin b00000 ; 以 B00000 为基址运行2 q% D6 f) G. N9 J3 s
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行: r l! Q( u5 W" L, s) M- t- K* k# t
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行: d8 g A( H \3 I: e
1 J0 l V) [& y9 x2 ^
4 u& G y5 g. S1 O: U: H
交互调试:* l) t# Y( _* G h& R& q
======================
5 P0 I8 L* O; \) Q9 \8 u7 v' q> h ; 帮助& A! M7 l" [+ l% f, h2 e
> g a00000 ; 到地址 a00000
1 A! E5 t' C) F> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)* E' C0 S5 S% ^. c; @. J- O
> d ; dump 内存 (现在地址), |9 o* i- P6 \* w
> d a00000 ; dump a00000 开始的内存
/ _9 N: W9 j9 f; C. T% _> d a00000 200 ; dump a00000 开始的内存, 大小 0x2002 I. w! G8 g: J; l3 P5 Y1 M
> d r ; dump 注册
, \, M9 v1 M/ i. `& Y> a ; 单句汇编# r" D$ z1 Y& j2 ?. _
> a c7d530 ; 单句汇编地址在 c7d530
4 }9 ]' u3 I0 N7 Q% Q& h( j# e> u ; 显示反汇编9 i& `' |+ l T. w' J
> u a00020 ; 显示地址 a00020的反汇编; s8 h0 {* U% f5 J( A+ L- _/ m
> r ; 在现在的地址上执行一条语句
f/ u9 o0 ?: `9 c8 u2 H9 T> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
7 \) Z% \# q8 ~5 y" w( @> r 0 ; 运行到返回语句 f7 `; Y2 J. z( O8 a
> r -c7d580 ; 运行到地址 c7d580, m. F' e7 }5 Z
> q ; 退出
( Y" Q2 k6 w0 a' d( K. O% u ]- t0 E A: y' b- m a$ s) G) n
*) 所有未声明的语句都会改变当前地址。8 j/ P2 ^' w6 |5 Y. X8 {
% T8 o0 b5 n% s2 j' m5 |9 a1 r2 j' Q! p8 z' @% o G
特别的助记符:# i4 Z- e" h; x" \0 \2 z: F N
============================
. }) U& M& q3 D- E! N- R*) 所有C166的汇编格式* F' L* H; i: y
*) 分号用于注释 (在一行的任何地方)' s8 a8 ^: c6 N% y: d2 H
*) 特别的助记符如下 :
$ w/ l, e0 r. o* y/ e. J #include filename ; 包含文件(各种定义)
4 h) `% T' H0 I' } ], ]4 h" v #define var value ; 设置替代变量 var = value
" z: e5 G( n _4 u var equ value ; 变量取值 var = value2 F# p6 b7 t) I1 e0 g, t
db 'X',36h ; 定义 byte(s) 数据区: o, v: r- T) O7 h% |9 `( A
dw 1234h,0,'AB' ; 定义 word(s) 数据区
& V6 F' U6 k8 G. {: g2 G0 l1 ~; | org ; 设定当前地址* {# `: V0 p0 E. A E7 F# J
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)7 Z- c: z! a s& h' l! o0 ?
end ; 结束记号
- w2 D. u: e+ _ ;#name XXX.string ; 定义补丁名称 (XXX)
; H' |- i2 G7 o! j/ E: y ' ; 注释将一起进入补丁: N" v5 h# ~6 B- V2 m+ w" X
'' ; 注释将一起进入补丁,加回车* h2 d, @$ I6 u$ T
'; ; 以下内容将全部是注释,直到出现 ''
8 q( _" }6 c- h ;' ; 注释将一起进入补丁/ k" P# ~) u+ Q
+ - * / % ; 加, 减, 乘, 除, 求模 操作% l T( N( t2 |4 M( q% p1 l! U
>> > < << ; 右移左移操作
2 R% d3 W5 u8 @ & && | || ^ ^^ ; 与, 或, 与非操作8 s& g: S. l" F1 i! R( W* X
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)) |; U, \4 Z/ f* x
page(value),
4 ]1 m% q) X% v/ R8 k1 R pag(value),* }( c9 J0 K5 ?$ {* ]
p(value) ; 页值 (= value / 0x4000)
; }! x1 J' F! e( c" F6 l7 q pof(value),
! K4 n! J. g* U/ x1 a, k q(value) ; 页偏移值 (= value mod 0x4000)
$ q9 q+ K( |! V- L! S4 ?9 y% ~ segment(value),6 Z/ q4 ?( T( w" q5 B
seg(value),
; U1 [$ u% b) f1 \3 V" T g s(value) ; 段值 (= value div 0xFFFF)
# |; z8 m5 _" b; z! \5 N9 k% w* ~; @1 u offset(value),3 G. R* [, i' s! S
ofs(value),; ]6 o2 M" h" @7 ?. s
sof(value),. g0 h o0 u8 I2 x
o(value) ; 段偏移值 (= value mod 0xFFFF)
2 \: E( M2 c7 M' A. R: } p8 l8 e5 T7 o. ?) U8 A
*) 例子:
! S7 S% t/ B& `3 f/ L) s( e, Z" z3 i2 f- [& W8 T5 \3 ~) W. ]
;--- Testing ---& [1 t4 A8 ?( F6 g
/ T' a0 ]& M0 n( `" D& R8 f
base 0A00000h ; 自动转换文件地址为 SL45 内存地址. M: x; _% n2 L8 |2 V$ Q) b
: `) j0 ?* b3 N: [& }6 f7 I8 s#ifdef ME45
) p8 K# g1 K! t* d1 h #include me45.inc6 ?0 m6 x' K- p$ H1 T# q! I* N/ W
#else& I* B. U" E3 Y! n+ y+ m- n d
#include sl45.inc
0 h9 Z5 s! j! D #define FreeRAM 37h:3600h& R( i6 M: r! V2 C/ W& ~: G
#define memcpy 0c7b384h0 f! U8 P6 C( A" v$ h
#endif0 }6 s: ~5 p/ U2 d( S- l; F
; y$ R7 u. S) {: y V- u* s
;#name TST. Test Patch ; 补丁名
* {' X3 n/ ]5 Z2 Y! N# x3 G% P3 t7 P" n6 y3 x/ V
'Firmware : sl45v56' ^( y9 a5 b, l7 t# ^5 E8 P/ q
'Author : rizapn+ T* `5 |9 E8 C* C2 J* U
'Updated : Aug 18, 20045 J' ?! w% G/ I% I
3 F# w# j! G; q9 O# w' i
org 0c7e000h: s) k+ P2 G1 D. y% }' ~) x
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
, ]% z8 x; B* Q+ p r, N mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
% ]8 g9 v. Y; t3 O- F2 t0 e extp #p(data2), #1 ; 跳到 data2 页3 m: o( Y$ I# ^# y, r% k2 L8 ?- u
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
+ _0 o, \+ w6 W7 {. e; o7 @ callr sub_1 ; 页内调用
# P R" N, q( s5 B movb rl2, #'A' ; 得到 ASCII 码 'A': M3 f7 o, g- Z. v6 t
loop_1:
1 D( P* ?; @$ Y0 B) V; l6 d mov r2, #1234h
. Y6 M& Y- a0 K% A3 N4 }# h1 Q& E mov [-r0], r27 }) ~- ^1 r4 f" U
calls memcpy ; 调用段表示的子程序2 r0 X' j2 q" h/ z5 S4 d
add r0, #2
# l: a5 d) \& n0 @7 Z- ^1 F9 x* A. j jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
* x7 x) w: Z2 b7 V4 I rets$ `9 q" k' {# q( D
$ x& m/ @4 s6 y: R
sub_1:; v# @$ A! v; r8 ~; F5 ?7 u
mov r4, #1234h# L I; \; A3 O
ret& W: y7 K1 w3 h( v
$ @; N5 c3 e$ x+ l/ }data2:
: }5 P$ D L$ P4 P+ W! f db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
5 \0 W6 c# X/ d. T
3 i' z: r$ n$ N' e+ p/ F e# oend& K& P! `6 \, z1 n: p
# P1 x7 M$ g9 \ c;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~, k5 a! U' ]# ?& v! N* S4 V. s
1 { x% i, s1 M) s; W2 ?7 X$ yAllaahu Akbar,
# w3 R" Z. ^, q0 X6 a$ oRizaPN <rizapn@yahoo.com>
6 T. z( c# j* Z) Y8 NJakarta - Indonesia7 A' N, C( ]/ `. ?# }) j* ~
- ]5 [6 `9 b* ]/ @' v
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|