- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
/ F9 e, j- D( w2 m' s
0 a( { [% _; t8 L7 s' Y3 b3 R: g简单帮助:, E! F: v6 c, D, z
====================
0 _) }0 A8 x* G) H7 o+ k* X*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。, F* X" L" D9 U: K8 }+ W
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.. T3 W3 \; h! @/ H( n2 g* i, g& h
! w) F: p. [: R* m+ F" Z* O7 ?
& y+ m! `2 J9 q2 Q' ~+ Z搜索空白区:+ N& Z9 I; S& \& _
=====================
$ T5 T; I7 U7 x* H* ]- W0 X> sfe 0 ; 帮助, ^/ d8 Q6 _! B- R+ s
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
8 H- T% |7 V. H) r4 Y, F* b> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间# @* W/ d6 [' r( d( M, m2 I# M
7 F4 G1 U2 l- k4 W, p' m8 S
二进制拷贝:% q4 V" W1 o& O: V) ]
============8 Q6 G! P" A/ F1 }: Y3 x; U- q
> sfe b ; 帮助) L8 o6 l b k k
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin, t* {( ]( z1 g9 }* t
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
" A, G: w4 x0 ^8 q4 |- Q7 w+ E> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin9 [2 `6 Z7 I ?/ `, l! O. y) o% ]+ ~) U
> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
! v) d6 N @0 P! E
8 q3 s) L6 T. ?比较文件:- ?1 o! O! N/ j; Y5 @. k
==============6 r1 h% y3 C# k, t
> sfe c ; 帮助, |; b$ d1 c: G0 W3 z' ^6 ^
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin0 {6 E. H0 }+ b4 o' G- ^+ c& H
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin ): s! q6 D! J& `5 Z9 }7 j' C
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
) h; G! ]" y" h* `3 h j> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )+ b, \! T' I/ O- ^
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
; Q9 ~& V7 W: w6 Z+ G> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
& r( C# e4 G2 u: g+ ?2 R9 n# I t> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
6 w0 T+ R2 I! E/ B B5 V2 B# e- ~0 N% ]! f/ u( b$ C. c
发现16进制的地方:- J4 l. f1 u3 K& A
====================
5 @# Z" V$ ^: f2 V2 ^2 u# C> sfe f ; 帮助
, o% d; O" m; x3 g> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个* t y2 |" ~2 {( G) W% j8 w+ O
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
" f% x( E/ r( y6 |> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes" w2 h% G( Q6 p. _
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找5 _- m2 O5 J0 L. _! @ x
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
: W2 N0 Q/ [1 n, `> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.# t) ~: i- }$ e' O/ K* G( q
3 i8 E2 ^3 }$ D. V- V) b0 [, @' n
提取语言数据:% c1 O" W. ^) [
======================
6 Z4 a% J) f& A2 f> sfe l ; 帮助
& M/ F1 `+ h% q F- y> sfe l src.bin ; 提取第一种语言,包括扩展文本数据; K6 K. G0 D. j% j7 l4 T
> sfe l src.bin 200 ; 显示 ID 200 的字符串8 {0 [0 g8 x7 e$ Y6 j- I
> sfe l src.bin 200 2 ; 用第三种语言显示字符串, r( L4 m6 z' b' S
> sfe l src.bin -1 ; 提取第二种语言
" e& I, |1 B. w> sfe l src.bin -all ; 提取所有现存语言
) ~( s% {6 l+ P% {& ]> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
9 d# t0 }0 }: E! A> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
4 v( ~$ \) t9 g& [: v> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
3 d3 o7 N( c# v6 m. R> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 " z; y( B5 R3 {. c G- }4 \1 {
> sfe l test.lng ; 检查test.lng 语言包
1 y: O" b! K5 r6 V> sfe lc test.lng ; 检查和更正test.lng 语言包" M1 D" h: P) Q0 L* x
* @5 [7 w9 m2 T5 |8 f2 j提取菜单:9 o2 r) w b7 g0 c. v# a
=============
: ?% Q, E7 T- _> sfe m ; 帮助
3 L/ r: w" E% C1 Y> sfe m src.bin ; 提取菜单结构和入口
( f. a5 Z' e4 r3 |. x9 l' \+ j
! o% m- l! e3 l7 E: N' d- s! e8 W* t; @. M! l6 S4 X
补丁:5 s0 h6 Q! S2 w9 d4 P2 P2 q
=========
1 y1 r" t1 x7 [> sfe p ; 帮助, |0 M# I% ]+ G- F+ D* }
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
+ L" o; |* S+ Y, `> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
6 e) h" [+ ]* T8 K: y> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz ' G3 D3 f& A& |. M2 Z
9 f9 A0 ?: a c+ A# M6 F( h
# O% h. F. ?( r编译:
- S+ _; I# Q- B6 i" ~- g==========' B5 R- }6 v, ?- B3 a, A3 N+ f
> sfe a ; 帮助
% r; T3 ~- ~: e3 N% i; S> sfe a src.asm ; 编译 src.asm
& q! q3 ?: { w( I3 }+ y> sfe a src.asm d ; 编译 src.asm, 完整输出
/ P5 m. \& \( v# [) ^6 l! A> sfe a "mov r12, #1234h" ; 单句编译
5 L) W" ^! o0 P; Q9 \> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
( X- U. L! Q3 }* n' l7 _! G3 ^* ~> sfe a src.asm,TST ; src.asm编译成补丁格式8 q, |3 t ]" U& a. `( }/ R/ C8 m
> sfe a src.asm,TST p ; src.asm编译成补丁格式/ ?+ b0 v- Z9 s! M) I% d" {8 ^
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
3 I" v9 o; c' l& M d3 ^> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
+ x9 a' Y0 T M- g> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。* o# v( h p6 s k
. w3 z' M# m6 p/ ^2 \$ f" b- t( x$ {
*) See Assembler Part to get more 'assembler' function detail, c+ X5 @/ j( i
8 K- H. S1 o8 B( a! a( h; ?. t1 {
反汇编:0 u! I! |( _1 `5 w0 ?! K A2 p
=============
# x0 S1 ]* |0 Q> sfe d ; 帮助; e* U9 F, ]: [
> sfe d src.bin ; 反汇编 src.bin
; S+ G5 R1 ~$ z" j' e) z> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin3 `& @% {7 X4 {5 `6 ~
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节% b Y `- d: \4 l
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000; J! u; \; A, `$ o
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
3 Y2 M5 X( J3 `! N" J6 m1 d> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
9 z& v* b I# h. T4 t> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
' A: X+ O& n4 H+ A+ @8 t: a> sfe d image.bmp ; 单色图形汇编输出
^$ ]4 B9 l2 C0 j, g8 j9 r> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。& \( t" P- J8 U0 H* K/ ^ U+ O! Z
$ }5 {& Q6 h) D$ h0 X- h/ C
调试:9 S5 M( b9 [) c o8 N* `
========= Y7 _+ v# r" q* X' H0 O$ x
> sfe r ; 帮助1 U0 {$ F/ C- G! j3 k5 e+ a& {
> sfe r src.bin ; 运行 src.bin
! \2 a" s% V8 |1 e/ f% s> sfe r src.asm ; 运行 src.asm 汇编文件 U$ m) w: K: A
> sfe r src.asm ,n ; 同上, 正常输出# f) {. U0 z4 @' F' I1 i
> sfe r src.bin,200 ; 从 0x200 地址开始运行7 n5 o3 I: i; M D( m, c) u a: C" Q- d
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2007 ^- ]4 Q' a( D" J$ \
> sfe r src.bin b00000 ; 以 B00000 为基址运行
2 A; j) a# X% G3 F> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
7 H1 a+ r) ?- X) D2 Y/ T> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
5 j3 Q1 t1 O6 q* l; f0 w& x
8 v6 I' A+ n: N+ c, d5 b v& c m- ~3 X3 I
交互调试:
/ K1 G8 w) e* b d( H' ^4 i======================: y, ?% v: _6 Y: \
> h ; 帮助+ H- d+ T, {% `. V' N+ y
> g a00000 ; 到地址 a00000
v+ w4 V, e+ t3 U) F! F3 P3 a> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
# u7 t% H- ?: }! Y8 @> d ; dump 内存 (现在地址)
+ L, |$ h, |4 L# b7 }* J3 W% z2 X> d a00000 ; dump a00000 开始的内存
6 L8 F1 m9 u& ?; P! ^> d a00000 200 ; dump a00000 开始的内存, 大小 0x2004 _4 s7 P, Q V0 R3 y0 G' X) Q1 I6 g
> d r ; dump 注册
' Y8 j' z0 `" n# b: I8 A/ P> a ; 单句汇编' U, q" x; c$ |2 k
> a c7d530 ; 单句汇编地址在 c7d530
( j7 t6 k, \% o) P0 ]> u ; 显示反汇编6 E/ u4 P# r5 K! A6 d' Z, B& L
> u a00020 ; 显示地址 a00020的反汇编. B' |2 D6 r% h1 N* D' N2 a
> r ; 在现在的地址上执行一条语句, S4 a0 P/ ~* N: Y3 p
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
L* ]9 B/ x! M* B( q' v> r 0 ; 运行到返回语句
5 P% x+ J* s1 Q1 f> r -c7d580 ; 运行到地址 c7d580
6 X# e' {" X, F2 D9 z> q ; 退出
1 I; V/ G/ v6 g8 X* L" m5 F O4 A3 n* Q! n6 @+ U
*) 所有未声明的语句都会改变当前地址。
; F. F; f2 f6 }; `, X7 L2 t& o3 V: u8 q% \- J0 z$ F
% h( f. V8 j) J9 L0 c- _" C
特别的助记符:* k2 b2 Q, J3 X& c/ T# w5 E
============================$ n5 Q0 V- A: S
*) 所有C166的汇编格式
+ Z; z; |, J) f6 C* m0 |* L* _( v*) 分号用于注释 (在一行的任何地方). f# i7 Q* n+ T
*) 特别的助记符如下 :
0 e F; D4 l: ?& r* y) I! u, M, P #include filename ; 包含文件(各种定义)8 y! ~, H- h6 V1 i u# S+ @
#define var value ; 设置替代变量 var = value& E( A# z b" f3 f8 Q+ k' o
var equ value ; 变量取值 var = value
, t8 N5 |/ X/ s1 _# v db 'X',36h ; 定义 byte(s) 数据区
0 t$ P) Z7 G1 M0 W# V! g: f dw 1234h,0,'AB' ; 定义 word(s) 数据区
5 P! W8 `3 b* L% d7 W6 C% q org ; 设定当前地址
( b5 h# r, n& F1 n2 Y base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
& b- @# A( f: u, V7 z end ; 结束记号7 J- x% A2 @8 `. s
;#name XXX.string ; 定义补丁名称 (XXX)6 Z) t Q7 E5 o; l1 j8 G4 h
' ; 注释将一起进入补丁; l1 N5 E7 g* g9 L: n3 v
'' ; 注释将一起进入补丁,加回车7 f T7 k! {# B7 i) T3 a
'; ; 以下内容将全部是注释,直到出现 ''. s0 q' z7 S" ^7 X( }% Y1 z
;' ; 注释将一起进入补丁. u2 U( ]$ j) r* J& t* l# J
+ - * / % ; 加, 减, 乘, 除, 求模 操作
$ w2 b* p: |& Z! \/ f >> > < << ; 右移左移操作
" m; q. [$ ~0 O2 R: W3 ?- F4 }# o3 A & && | || ^ ^^ ; 与, 或, 与非操作0 _ \2 T! G0 M# t2 f
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)0 m. E' k# F- ^- D0 Y! _8 _3 H4 N
page(value), 3 s0 ~$ H* Z# F! \; S4 I; U7 B: E
pag(value),
+ T5 D( t% i# ]. D* a p(value) ; 页值 (= value / 0x4000)5 x" J$ _6 t0 F; e6 \/ }$ ~
pof(value),
4 f, ?6 Z0 W$ b9 q7 q q(value) ; 页偏移值 (= value mod 0x4000); A8 A9 c- R- O8 g; Z, O
segment(value)," n! U* N8 @& J Q) n
seg(value),1 S' S: H% N1 K7 R$ g
s(value) ; 段值 (= value div 0xFFFF)3 M: H7 i$ C: L
offset(value),6 \/ R7 D/ c/ _$ ]- R
ofs(value),4 B- Y3 [9 H5 F! z6 x: e
sof(value),: e1 f- s: ?: J& U( b+ H0 O
o(value) ; 段偏移值 (= value mod 0xFFFF)
( P, {$ ^- `( n( T
1 p! z% T) v1 ? T' E& P' t3 P. W*) 例子:
4 ^' i3 u7 g% Y. h6 G2 ~/ V l6 C6 e F& X$ Z6 l
;--- Testing ---
- b% `6 _+ K, y. q5 t& _5 R! ^) }6 t K& ^- y0 P" H* P/ P
base 0A00000h ; 自动转换文件地址为 SL45 内存地址
m" m m8 g. L, c/ D* O5 X! m/ o# Q8 ], k* P" v3 D
#ifdef ME45
8 [' S x/ R* I$ B5 U% m #include me45.inc2 v, W! A4 `8 d
#else
( k9 y9 {& O; U6 J #include sl45.inc
$ d# I G! Q( ^ f$ J& C8 v2 n #define FreeRAM 37h:3600h
: b C2 a7 [; n$ `! r" O #define memcpy 0c7b384h/ W& t7 \( ^" |" K
#endif
% a! V* y5 g( {* D- g. A/ `- j) `8 r* @& W3 y
;#name TST. Test Patch ; 补丁名( _3 J, {/ U: w5 H
* Q. U7 e7 x1 U'Firmware : sl45v561 Z+ W% ]* l* M1 r$ b
'Author : rizapn
# k# j- F V3 C% G$ ^7 M# ]'Updated : Aug 18, 2004+ C* Y; N* F( o
9 b1 [1 U- [! }0 c0 N1 }org 0c7e000h: ~4 ]; S) a( Q% F; f) V& Z# F
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移, Q# j6 r& d0 f+ q
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
$ c ~5 @; k$ A, ?% R8 q extp #p(data2), #1 ; 跳到 data2 页
. o3 J1 K) e8 _+ F, U movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
6 N S5 c" d1 |' Z9 c1 c callr sub_1 ; 页内调用
9 j- F1 }. ?1 {2 U1 | movb rl2, #'A' ; 得到 ASCII 码 'A'# V* E3 U. [. U
loop_1:
1 b- n; o# Q$ [+ V7 @ mov r2, #1234h
* P$ x) C" Q; f$ c mov [-r0], r28 K5 t5 L/ x' k) Z* `; y3 z
calls memcpy ; 调用段表示的子程序1 j; B( ]5 H4 ]+ P
add r0, #2: i/ [+ ~ v U: T2 G2 d" u% f
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处5 }& B: G) I# F; G' ~. p
rets
$ j' O/ Y3 U2 y& [# x F: o) `
1 q: j5 x& X0 X- A/ ]) W; h. V/ Rsub_1:! }, R" Y" g: X; f# W- C* {
mov r4, #1234h# P- c- E1 l: }! y9 e9 X& T9 c0 l
ret
+ I5 Q* W* v6 u, Z" `" |1 i0 q2 ~# d3 F
data2:' D/ U1 {5 ?. w" p; a6 w
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
$ y7 d; ~* W& {. e! g# r
" r$ L/ s! m3 L1 ^8 }9 }. Bend) D5 o1 o+ m# H& R
7 }" Q, T% S' |: ~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" h/ }% i& y' i! z8 P t+ {
" d+ X y4 }6 s% HAllaahu Akbar,( c! O" V: T7 P0 i& y; Q
RizaPN <rizapn@yahoo.com>
* U3 n$ i+ q, a; S$ P' j- DJakarta - Indonesia- h9 R! Q) q, H4 B9 Z9 E6 C
, y& d: j4 Q; f* z0 w& u[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|