- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:- x' ] B& J, ]+ [( W X8 G+ ]
% I p u2 w" }简单帮助:$ T. k$ b; C" Q0 \
====================0 z; }( P9 q$ @; A6 j9 m" m
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。7 j8 F0 J& \& N; e" X7 B& e4 P
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
F i7 P- q) x. W+ o9 h0 V$ F* Y5 @% C5 s
9 v- i# g1 G3 o3 Q& L% M9 K搜索空白区:
, y4 B! Y; q' v; D! d( f- @=====================, q* T1 ^4 i& {" V/ V
> sfe 0 ; 帮助3 E9 q9 V" z' M ]
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
- F, n9 |1 e9 {' x) z* i# A3 P> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
( C9 { N# z% ?. G: S7 Y& N8 k+ b0 V1 P( p
二进制拷贝:8 h% ]( ?4 n8 a2 ^9 E6 @
============
4 P R. L0 G/ Y; h' m2 g0 V> sfe b ; 帮助
3 B. Z! {. i9 ~% L. e. _6 ~> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
! k- h! e% `2 D: z! f> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin h0 ^+ B/ X8 m
> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
4 w- C- L! L2 B0 q; m> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
) i/ @% O% S, q: p% Z
: {, U* J: G) |' g3 o; f比较文件:
, P" a$ m5 ?" o+ k: \% ~==============5 h4 M! U) C6 }/ L9 J
> sfe c ; 帮助
0 x# H `8 E2 S0 F$ _) V* W% v> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin) k: q# a1 x! B/ Q$ R3 z* p7 u9 F
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
+ f E/ w4 a5 q# m/ C> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
6 r: k8 y6 R6 P8 R" p+ e> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
# }1 ]! q% V8 ]3 I> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000 ^0 e/ p* u5 b4 m! n2 i
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
6 @4 N, C. P+ e$ t6 ]> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)2 O6 ?# I2 }" c/ O" S, F
' Z" x: H; S% S9 D) z% L2 r' b发现16进制的地方:6 x- r( C8 Q& z
====================( r6 T; x9 \# a6 |# w- K
> sfe f ; 帮助* R( Y; M; B% h
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个$ ~5 L6 V' k+ C) L; e
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
] O, x' g; R- R2 t7 \> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
, B7 M8 J7 ^9 G' f> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找8 u" e0 n% ~7 ], C$ z0 b J
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
* i% \. C' a: q4 ?: u% V> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.4 E, z* A( \. m) r1 k: P
' U1 W5 }# O! w/ ^) U
提取语言数据:1 \ {7 C; E; v- v% |
======================2 O1 f$ g9 N/ v/ i, D2 a5 k6 L
> sfe l ; 帮助$ K; L; x! ^( t: e# W
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据9 w' S7 L, ^1 Y- T
> sfe l src.bin 200 ; 显示 ID 200 的字符串
" R! Q6 s8 _5 x& l7 A M6 J> sfe l src.bin 200 2 ; 用第三种语言显示字符串
, H* b) b. d, a# j" _> sfe l src.bin -1 ; 提取第二种语言
9 U5 z6 p! W, _% L> sfe l src.bin -all ; 提取所有现存语言, D, _) W: R. z+ ?& `
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
; ?; g- x- l# D2 c5 [> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言); M/ `9 p' d/ F9 i& _! R" X
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本9 i# Z$ u }4 w
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
. F! ?4 G) L% p& s1 a1 }) d> sfe l test.lng ; 检查test.lng 语言包
8 ~0 u( x% O9 z> sfe lc test.lng ; 检查和更正test.lng 语言包
6 A/ ]) ^2 @" N$ I0 v) R) ?! O! b( d. ]. _ U: b
提取菜单:* W' A" m' M( z9 N- h
=============1 U" m. J- x$ k& {4 R
> sfe m ; 帮助
C; d: F, p. x1 S8 x+ j> sfe m src.bin ; 提取菜单结构和入口
( L8 G0 A. t! x& K4 r$ T( @1 `$ R: v8 Z6 a* P$ Z0 Z, W
1 k7 |2 ^1 \- d, F! ?! \- O
补丁:; G. _7 U7 B9 M1 d! b& E
=========. S* e& S, Q% S L; k3 }4 u
> sfe p ; 帮助
$ r4 u# P$ p& n H( c: B> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
/ j$ K) p! o; C" z( T0 H* P$ ?/ R" n> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
. m7 z+ p: a$ N s> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz * L/ n$ ]; k0 P9 M8 L0 r# V% }$ e* L
. X5 n: L+ U% z
* ?! R# {3 a* W& ^, Z& y编译:/ `" X. h8 V& J
==========
: n. l$ ~& h8 R2 Y: M1 p> sfe a ; 帮助0 C% a) e' {% u$ ^6 Y! O
> sfe a src.asm ; 编译 src.asm+ ^% @8 E7 U, z I
> sfe a src.asm d ; 编译 src.asm, 完整输出7 Z" \. Y- Y, T* m' M3 l
> sfe a "mov r12, #1234h" ; 单句编译
* I( {& d3 j, L, }- n6 F( F> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译" {& q# f) f6 f2 \, `9 H
> sfe a src.asm,TST ; src.asm编译成补丁格式
4 T- ?2 Y/ T) ?6 Q' V2 O$ ?; Z> sfe a src.asm,TST p ; src.asm编译成补丁格式% y1 d9 p# r8 N
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
8 F! ~) r" a& T8 F> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
) M( T; Y( O! W% `" H+ T> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。+ T$ k* R u% [. i
2 F7 C$ a3 }) u% Y$ l/ D, h, V
*) See Assembler Part to get more 'assembler' function detail
3 {+ P# Z" z! A& U1 ` C% [4 y2 I) g* a L& Q6 |
; ~5 C6 |6 g0 b* q; y9 h/ ?+ \
反汇编:/ D7 P& s" x8 E$ Z& g/ W
=============
' [8 O& A6 V' v* |3 m8 b w6 q9 p> sfe d ; 帮助" R1 K+ P# P2 u. m
> sfe d src.bin ; 反汇编 src.bin
: g6 L" i) b, c8 c0 X! a> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
! |$ l, i$ @2 n" @> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节( l: m f1 ]! X0 L! c8 _2 [. {7 ?
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000
( U! P' D. r' D& b7 s> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止1 w! |, @- y- L9 X; _
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
I% p5 q- d5 Y$ z; R> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
7 m% b+ R% f( V1 ]8 d4 p/ m$ u8 r- f5 m> sfe d image.bmp ; 单色图形汇编输出
% A+ q& ]8 u/ h: r> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
6 d) k* D( ]6 a' J" {4 A! {. g* u9 k r7 w4 u8 R$ w8 w
调试:3 b' p( Z( h; \% [
=========+ O" Y }6 e2 y t" \7 h; p7 }
> sfe r ; 帮助' X6 y0 @( ~7 v7 E |$ W$ Y7 z
> sfe r src.bin ; 运行 src.bin
: e1 w: e' w' _$ I; h* w> sfe r src.asm ; 运行 src.asm 汇编文件6 q( h8 m% E+ u: s% {) j
> sfe r src.asm ,n ; 同上, 正常输出- a, ~5 O# F/ F; U/ s" J
> sfe r src.bin,200 ; 从 0x200 地址开始运行
- j4 N4 \0 Q9 X0 k: |7 l8 l5 \> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
7 W0 O/ R1 E# J& C9 ~; U; g> sfe r src.bin b00000 ; 以 B00000 为基址运行
1 ]# @( `$ s. S+ c$ Z3 Z9 `5 F> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
4 x! R e4 ]$ r$ _> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行4 s6 i$ S+ h; @, _! ]6 l
: g9 B& ]7 e" D
0 w: a8 C' _9 n5 A" x交互调试:
9 M+ F- k( q0 Z, k# c+ Q======================. U" G G% e2 N1 v3 C5 { [
> h ; 帮助
8 E' H8 i2 e: o7 O> g a00000 ; 到地址 a00000
' v' O# @ \) Z" c; a' Z3 \9 M> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
. j7 a) ?, O* \0 ~1 ?. Q> d ; dump 内存 (现在地址)/ Z; E& q- a& T0 x
> d a00000 ; dump a00000 开始的内存
' F2 F6 k+ W( {; Y9 U> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
/ }+ h, I9 b; l, g5 E> d r ; dump 注册
# x# R1 Y9 m( E! {! o> a ; 单句汇编: }0 o& S* r0 V5 f. R
> a c7d530 ; 单句汇编地址在 c7d530
. C& ?& o! w" e8 {> u ; 显示反汇编
: o6 A* `# R, _6 j% z+ q> u a00020 ; 显示地址 a00020的反汇编8 I# A2 s& c& I& T
> r ; 在现在的地址上执行一条语句8 i7 l, U, Z0 j! l0 j
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)! E6 I3 |) S5 h3 T8 e
> r 0 ; 运行到返回语句, C4 R- `) p+ }- V) Z- w
> r -c7d580 ; 运行到地址 c7d580
|1 |: @) S% v7 p5 g+ U> q ; 退出/ Q; t' [1 A v; |, q; X9 m& O+ f
M8 q& R6 z( O& ~6 u q- i2 @
*) 所有未声明的语句都会改变当前地址。
. B; ~1 ~4 c7 i: } B# I# Z
8 a! r# z( v( l: Q4 Z& { `# o5 `7 S K* |
特别的助记符:
) O+ q" o' q) L0 M" l: y============================
, {* ~0 Y+ e' k' K4 ^) r* i*) 所有C166的汇编格式
) l8 L& S6 i# e*) 分号用于注释 (在一行的任何地方)
0 u7 W% g- G- M0 q7 i+ h*) 特别的助记符如下 :7 O" y" J) L S% v( [6 ~
#include filename ; 包含文件(各种定义)* P' I0 I: `) ]& ]
#define var value ; 设置替代变量 var = value, y9 N. ~: ]( c1 }
var equ value ; 变量取值 var = value
' P: Q! |0 v3 I+ ^3 ?4 Z# k db 'X',36h ; 定义 byte(s) 数据区
- }3 s. y! L5 I; G dw 1234h,0,'AB' ; 定义 word(s) 数据区
( s6 G" g& s; Z) O+ s& F org ; 设定当前地址* t% T6 }2 x2 b% v3 t
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)" }9 h$ \2 Y6 I2 l
end ; 结束记号 J& K/ ]" y! T! _
;#name XXX.string ; 定义补丁名称 (XXX)" U' D* ?2 ] Z5 |1 }4 Y% R
' ; 注释将一起进入补丁0 d5 M/ P& T% ]9 Q
'' ; 注释将一起进入补丁,加回车
- r) ^: V- h* j# {3 p# c '; ; 以下内容将全部是注释,直到出现 ''
3 {3 ^ J+ S; [4 g+ ? ;' ; 注释将一起进入补丁 I' |$ r% x5 X8 V) E" o/ F, U' {
+ - * / % ; 加, 减, 乘, 除, 求模 操作
+ l8 V' }& Z8 v0 _# _' J >> > < << ; 右移左移操作
% X$ a' Q+ I8 b# ?' Y & && | || ^ ^^ ; 与, 或, 与非操作
7 T J* a6 F4 C. | val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)' x- G# R% F' d9 f8 N# g
page(value), # t' ^. [3 q `, B, m! b$ [/ ~7 o
pag(value),
A; J; O( h. n4 t) C p(value) ; 页值 (= value / 0x4000)- h1 |% Q1 U, F' u+ N
pof(value),
$ H8 |$ }- U/ @$ K$ f" W+ Z2 Y q(value) ; 页偏移值 (= value mod 0x4000)) _- a4 L- V1 c, x( X
segment(value),
! M/ S! g# v! ?5 {' Y2 L- h9 O seg(value),' W' c$ h c2 _8 l4 S
s(value) ; 段值 (= value div 0xFFFF)$ b' A9 F$ d! ~. n) M
offset(value),. R+ X: P3 s7 K, ~
ofs(value),
9 o! |" u! I% f( J4 E sof(value),
; M6 w7 @& H c' A5 [9 r o(value) ; 段偏移值 (= value mod 0xFFFF)
; f$ M/ [* y! r. A. [4 g0 E; r2 ^# C1 Z" e4 p; v _3 _- _
*) 例子: L; `+ i$ o+ O! S/ o
+ R8 R; e0 S0 r. K6 T* F
;--- Testing ---
, l @- i u( I0 d, t3 X) m
4 c/ T/ H5 Z; G! z8 jbase 0A00000h ; 自动转换文件地址为 SL45 内存地址- ?2 Y/ z+ Q+ w" R$ M, V6 V
8 W8 T0 ~, k0 C- ?% t* a0 X
#ifdef ME45
! V: H6 R y- P9 D/ [' X #include me45.inc7 i9 r( D( Y" X7 R: y9 V/ Q# ^
#else5 F# p( C% S9 M6 m2 I+ \) D
#include sl45.inc P/ `, |( m% j4 W- I+ Y7 N
#define FreeRAM 37h:3600h
$ i) T B1 K9 A( ^0 g) H, `( v #define memcpy 0c7b384h9 C1 }. O: } h+ i3 c5 V6 B
#endif$ B! C& ]- j% \/ s1 M
$ g; z. G' {- j7 e;#name TST. Test Patch ; 补丁名
K4 i: x; ?% _0 N& H# @6 O2 x8 V. @$ l: d, L7 @& w9 S. b+ {. B
'Firmware : sl45v56* E, B( X9 a3 x; l5 d
'Author : rizapn
0 I* k% {0 L% d- G' Z& R1 `" {'Updated : Aug 18, 2004
h8 m0 u. ^ _
2 e! m/ z4 g5 f, _& A, ]org 0c7e000h
$ \. A" r- N3 r: n7 N mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移' q9 w' {) W# P7 J5 C+ i
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
$ E- U! L0 ^& h8 d0 G# m; y0 f extp #p(data2), #1 ; 跳到 data2 页) x8 R0 G' c& z* S3 R) T2 i
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)4 j* S& r# a2 t3 R. R$ e
callr sub_1 ; 页内调用( { a" u8 q4 |
movb rl2, #'A' ; 得到 ASCII 码 'A'4 V! Q+ ]) {6 P6 T/ [
loop_1:
3 r5 z2 ?$ Q( w mov r2, #1234h
! C5 x5 \$ b- M$ b% E3 l- b mov [-r0], r2
; g) G: S' b- F calls memcpy ; 调用段表示的子程序- Q# }8 f v1 W! N
add r0, #2) d, A9 C8 a/ Q. i3 O, N5 y5 t
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处- A$ _$ E+ x. A% W+ \) e
rets/ K6 C8 [0 z4 d7 r
+ e9 Q8 W' ]) Q ?/ k+ x
sub_1:
$ ]+ \6 @7 I8 \) Q j! ~: C mov r4, #1234h
' U' U! L' c/ Q; w2 z! V ret) e- d" @, ?- I" \: g8 |& ~& X3 _
6 h/ y+ `3 A/ Cdata2:
" G0 F2 Y. }. h2 x; J; @- a db 'A',10h,'Testing',0 ; 定义 bytes 型数据区& c. Z$ ^" q( o
9 {7 N4 M; I8 Z: C! rend
8 x [' U: E' f+ r- H. i1 W' l2 V6 G+ u3 R. C- F0 T
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
% z: W2 @. Z' w/ n2 J' S. W
. m! `, c+ ]. v0 e V, uAllaahu Akbar,/ X: @' u5 Z0 N R
RizaPN <rizapn@yahoo.com>
! n" W' ~9 T( K$ v8 g% l g! g3 CJakarta - Indonesia
& g3 [6 A4 w3 X# `0 |6 {0 n6 v& d' A! J) G6 ~
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|