- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
( X" h& R+ @# |2 u2 v
% d& x N0 A( J简单帮助:
' ]4 e2 \0 z% x. S; p====================
, T8 E5 A, C# o0 L4 L/ Q*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
% J0 G/ R0 h* u( i, X+ c*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.& d. @. x# t) V
+ M1 V, `. _( n5 u2 d
0 \. o# T) N, L# q& {9 W. s搜索空白区:2 j3 F* [2 m+ K% _2 A0 z
=====================1 c7 n; O3 m, _& @7 V, Y7 K: X0 L
> sfe 0 ; 帮助 K# `' I; R. ]; }
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)5 [5 _1 n5 ~3 w1 Z; ]. e& L
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间# o. S8 g* i3 {/ {
6 s! T: S! b! i+ h二进制拷贝:
9 T& l7 s! A" K7 d! V============
) K$ q) j. n. J. X4 d> sfe b ; 帮助" @ i0 l+ @' A) |! V
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
+ _* v/ S% f$ |, N3 m4 }* x. t> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
2 W: n$ b+ @4 e# g> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
2 y7 S' c6 k1 @, a8 y> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x2002 j. B9 l5 K# i# @. X2 E: m% u' e
8 w! [ e- g. U9 Y比较文件:
0 D' q# h$ F1 \9 N, h# x7 F==============: w# o% x9 p7 L- o0 ^' O
> sfe c ; 帮助
& m$ e* e% d' V2 t% f7 a> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin& k( Q7 U- `( t* b" t
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )7 ?4 g F3 I M! }2 u8 M8 f
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
6 z: ~; W; Z# k# V; G> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
, b6 m, Z2 j* ~& h8 f> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A000009 H" [. V$ W8 f6 G
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes6 @( \) Z$ w% v E# A1 K
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)2 j( E; H4 O, g! i, k0 P) N
1 H9 d$ u, _) D) ?. {发现16进制的地方:- F* ^5 \0 S6 F" J7 _
====================
7 }- j! H. N/ w1 N6 T> sfe f ; 帮助
# Q/ {& |) N( v; D> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
/ e8 Y; R% \3 z f4 K- J" i> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
6 g" G4 o( i' {" u% H3 s> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
" K; B9 U7 a! u" B4 M. l& L> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找9 h( p( T& }, }& _- E
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小4 w; l7 F3 `/ }# O/ m0 L
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.
' b! w. g2 _# ~( c7 M5 @$ A: {( m' y+ a9 r3 V
提取语言数据:
: F9 {8 Y+ h" n1 v \1 H======================
, A0 |' N. z0 ~> sfe l ; 帮助( q. M1 j- @; ^4 R1 U8 ~4 U9 D
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
$ ~9 f" q9 ]4 i/ d" `> sfe l src.bin 200 ; 显示 ID 200 的字符串" o% w2 s+ M+ {1 X; F6 p: _+ Y
> sfe l src.bin 200 2 ; 用第三种语言显示字符串0 Y2 ]1 W: ]: e2 f& ^
> sfe l src.bin -1 ; 提取第二种语言% x% T' E @& u h
> sfe l src.bin -all ; 提取所有现存语言
4 H& H& N0 x/ O4 B7 g9 M6 ^> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
7 Q4 S1 k: x/ T% Y9 J/ J7 Y" |9 c> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)- K9 o, F! s3 S7 b O: w4 ^) E
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
, E2 S& l! x8 D/ C/ z$ x7 G9 P: S> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 4 t2 c- t6 B3 o, \& X9 s5 w
> sfe l test.lng ; 检查test.lng 语言包) g3 L m w! p& q! X
> sfe lc test.lng ; 检查和更正test.lng 语言包, E- ]" U% J* E7 r
+ n3 p6 G8 C* Z4 F提取菜单:
, F; B/ ?$ U6 N$ D2 r$ w/ R=============
/ C3 D) L1 d6 s> sfe m ; 帮助
6 L3 v R6 i( _> sfe m src.bin ; 提取菜单结构和入口
2 {* p3 u# R0 y) s! x& q
0 M& J& \" n" C, ? k6 h4 N7 Q
6 d8 \: L$ h) `; ~2 ^) r补丁:
/ u% f( D/ S) x8 K' w1 q' V) c=========2 G, f" G& U, s$ q7 t, O- b
> sfe p ; 帮助* ~0 i9 `& V f+ V, o: o
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
/ s7 i6 B5 j% Y- w* `5 s5 o> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz' ~. |0 Y1 i% a6 N& i
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz * X1 D. ^+ s$ l( D' B
P. q& H; t, x/ j* @6 y# q0 Y# A
- J# k5 j4 \, P H) W8 n; r
编译:
" ? v8 V" v9 E! b$ g6 i3 t==========: c4 C) M2 }1 R1 y& }* h- y
> sfe a ; 帮助) ], v1 H! }2 m0 k. s1 O# s
> sfe a src.asm ; 编译 src.asm1 D% p3 ?6 R& o
> sfe a src.asm d ; 编译 src.asm, 完整输出4 p" a. V+ T! _: g0 W) {% K& j
> sfe a "mov r12, #1234h" ; 单句编译8 m. E% s& \3 Q+ [, W4 x
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译5 q' t$ W: q1 i. Z' f% W0 [, ^ `
> sfe a src.asm,TST ; src.asm编译成补丁格式7 A- {3 e2 G' F) g! S' U O+ n. \
> sfe a src.asm,TST p ; src.asm编译成补丁格式4 u6 x* N' Q5 y9 p
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行# s4 q7 ]% d3 ?/ r
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
8 W% _& K' g% M" @5 D0 u2 I% c- E> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
* U& l% r- g7 p6 `, X2 j" J: {% F5 s0 b* }
*) See Assembler Part to get more 'assembler' function detail: Y/ g, D( w( j/ w
0 a' m7 f& G/ J* B; H; ^# X
% b. } r8 ^; a- X S- g# b( x# y
反汇编:8 U* c9 |6 E. k* |1 }
=============
' ~) ?' N5 _+ k, ^7 j ? m> sfe d ; 帮助* j Y. L \5 H
> sfe d src.bin ; 反汇编 src.bin
% W, x5 [8 F2 Z& D2 R> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
& b, n6 w8 H, U" R1 t> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
6 J& Y |* G7 k7 l% K9 I> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000
" Z# H; i1 a& H* P1 {6 m2 D> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止; ?1 w. a5 {% Y6 a1 ~ {
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
0 {# N) o, ^! z9 j1 d> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件4 w8 T; E2 m! S
> sfe d image.bmp ; 单色图形汇编输出
! w5 ^- y$ q# s7 I( I> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
/ G: x5 E6 u) f3 }8 j5 \) h, ^* \0 y% { v$ X- B" H
调试:
% P- G7 ~' p6 G- d- T=========
6 C! V1 ?! j% @. g! r> sfe r ; 帮助" L r6 u! n/ @ b1 X+ z
> sfe r src.bin ; 运行 src.bin
; Z3 O7 D2 W, ^" r7 E> sfe r src.asm ; 运行 src.asm 汇编文件
! Q( i8 J( q% O. M> sfe r src.asm ,n ; 同上, 正常输出
8 F3 q) Q* a, |0 g0 N0 y# ?& i+ y> sfe r src.bin,200 ; 从 0x200 地址开始运行
% x: c! H7 G3 C7 I- o6 E" c> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
7 S( g2 g: s; A5 H {> sfe r src.bin b00000 ; 以 B00000 为基址运行7 r0 M5 m, W9 _$ [9 P/ S+ V
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
0 L" K z# p( L: b3 }> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行1 w8 L Z6 T- d5 M6 D7 ~
% L, |* M: S1 Y$ U4 W5 [: m7 z8 a9 l+ V+ }) S
交互调试:
. x0 O( J/ S% h8 a======================
8 G% h% x; B, D> h ; 帮助
. [ _6 I% s" m3 C( t3 w> g a00000 ; 到地址 a00000
& ?" s, A9 i6 F8 _$ h; ?) J* `5 i: \> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)' W a# _( ^, n
> d ; dump 内存 (现在地址)
! q1 O1 h$ s/ ~# c, C> d a00000 ; dump a00000 开始的内存* ] L1 X6 @' t
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
" a0 N4 T4 w( m% @: D> d r ; dump 注册
4 l9 _& [$ Q1 W$ o> a ; 单句汇编- ~3 L6 \1 ~' h& N- C6 P" t
> a c7d530 ; 单句汇编地址在 c7d530
+ M& A1 L; d% Q, l0 g' S7 q> u ; 显示反汇编
9 u q. M3 N6 I! ] `> u a00020 ; 显示地址 a00020的反汇编$ b$ \2 Y; Z" L! I( N9 _ ~ R
> r ; 在现在的地址上执行一条语句* y7 e1 o7 S. \# h7 w' o" s: s X
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)3 ?5 e5 U% L+ D7 ` h5 I* V! X
> r 0 ; 运行到返回语句; u& A6 x, [) s+ D3 |+ }
> r -c7d580 ; 运行到地址 c7d580
: k: _3 u8 N8 X; `( o7 a9 P> q ; 退出
; R) ?) Y4 I+ }& d+ I7 l2 @3 A' ]9 t9 A4 Z( r( d0 Q
*) 所有未声明的语句都会改变当前地址。
7 _3 l8 B0 b+ _; Y
: s0 I* ?9 J" Z' G6 l
/ Z# b+ D, x4 r" Z. @/ ~特别的助记符:9 n1 G0 w, j: X1 a8 }* t. F! O
============================ D. M5 A0 C! ]/ q
*) 所有C166的汇编格式
. y) Q8 _7 I8 l( B F E*) 分号用于注释 (在一行的任何地方)4 b" @0 b9 @6 [- K: Z7 `$ Y' k
*) 特别的助记符如下 :6 X; s7 Z. G9 m
#include filename ; 包含文件(各种定义)# j# m* F! k. S6 z! a
#define var value ; 设置替代变量 var = value% n, F3 _7 \7 O- k! |5 ^' q. q# q J0 |* Q
var equ value ; 变量取值 var = value
$ I* L2 S2 I) d6 D6 Y1 {! N# q db 'X',36h ; 定义 byte(s) 数据区
: ]2 c5 T$ }' M dw 1234h,0,'AB' ; 定义 word(s) 数据区6 y9 m- |0 O5 k; ]
org ; 设定当前地址7 N3 `9 ^8 p6 k6 H4 S
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
* n) a5 p8 ]2 V end ; 结束记号
* u; _. ]( d. _: m2 f: M ;#name XXX.string ; 定义补丁名称 (XXX)
( e/ J& i. G8 Z ' ; 注释将一起进入补丁% _- U- I# g5 J2 P- `
'' ; 注释将一起进入补丁,加回车
* r& W$ f |' x& |5 e' ~ '; ; 以下内容将全部是注释,直到出现 ''3 E" Q/ x# c- m8 E& j" l5 e2 _+ ^
;' ; 注释将一起进入补丁
! K: i% @0 M6 Y( J5 G + - * / % ; 加, 减, 乘, 除, 求模 操作% S4 c" d, X9 c; @* J$ {8 f
>> > < << ; 右移左移操作4 _# z3 y( o: V
& && | || ^ ^^ ; 与, 或, 与非操作" o- C0 B7 d6 P4 n. P8 o7 b# W/ a( O
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
2 R2 X; Z- u, F8 l page(value), % j( u% G3 m4 U d5 H+ ]
pag(value),
& a$ i X7 R# V8 b3 W) { p(value) ; 页值 (= value / 0x4000)+ t6 f. l, J6 l0 S: a8 m
pof(value),$ ]' }4 ]4 m: [( f
q(value) ; 页偏移值 (= value mod 0x4000)
# j( \; b* @7 \/ ?- x: b- z5 d) Y segment(value),# f) C0 ~; e. \( \3 u& X
seg(value),
5 H5 a* T7 Q: h6 S s(value) ; 段值 (= value div 0xFFFF)+ u2 e( k+ v z4 W
offset(value),) y$ i4 C# t% @/ a9 Z
ofs(value),
' _- s& q4 S' q, U E sof(value),
* O& \! H! K/ s1 j o(value) ; 段偏移值 (= value mod 0xFFFF)
6 P& S- I |9 e1 |- A+ e( k& O- k1 E- W4 O' d1 b
*) 例子:
4 S k5 I2 @+ L0 ~
. }. ?6 c; V" N* D( h' a p;--- Testing ---; R2 D7 v" P: {/ B7 k9 b
$ L( ]1 c; E1 W2 }. x9 m( B
base 0A00000h ; 自动转换文件地址为 SL45 内存地址$ P* o+ L# D8 w$ L5 D
3 A% s% V8 j2 k#ifdef ME45
6 a9 A4 Q5 a; O/ m0 Z6 ^ #include me45.inc, e7 Q; j* V9 s" P! m
#else) V3 I& x2 u/ d
#include sl45.inc
( u& i% ~' u2 _; f" X8 P #define FreeRAM 37h:3600h
; I6 \2 ]& T8 ^* e* u3 M #define memcpy 0c7b384h
- F6 R% B* v. V8 k/ `#endif
' J& J& P- t; o8 \
: Z6 ?/ X2 Q/ N;#name TST. Test Patch ; 补丁名4 o0 n6 h) Q3 P3 X0 e
! n. U8 J9 b& M'Firmware : sl45v56
8 N' L3 N( C4 y' d: M'Author : rizapn% b3 A8 j' w# n3 w
'Updated : Aug 18, 2004% X7 J! ^1 O1 ?- N' r' s C
O3 `3 w; o! Z/ o" v- }- ?# }
org 0c7e000h% a# B! b# ^6 ?" z% g3 d
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移1 N9 K' _9 g, u3 Q1 @; k
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值5 l, _4 ?0 E: J5 q1 A
extp #p(data2), #1 ; 跳到 data2 页2 @, C+ i& T7 R5 N' H. S/ K7 c: c% |6 V
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)7 @4 D+ _% x0 {. A
callr sub_1 ; 页内调用
( ^% j; k1 V) C: c+ t5 S movb rl2, #'A' ; 得到 ASCII 码 'A'& w2 X$ k4 I) O. \; J% `- S6 k
loop_1:; g0 p2 \8 ?: s' @( L q% O
mov r2, #1234h3 |5 {7 L6 O6 n3 n- s
mov [-r0], r2
! z3 M& N8 b% P* L& G calls memcpy ; 调用段表示的子程序8 Q' `) A* W# n. ?( D% ^
add r0, #2
/ ^7 E! q/ n' N jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处' H4 M$ j. `! T2 c) \& G q% _* o
rets
' u% }; P/ I7 I! x
3 o! g9 T. l. T& v/ L. ~2 hsub_1:# E9 f$ @ R+ V6 ~, u9 R/ p5 X
mov r4, #1234h, T+ J; P- J, I% P+ `
ret* M2 M# G }7 B" g
! Y# x8 } r% s( vdata2:
3 k3 M; O9 J2 w1 X1 A& ^. R9 X ^5 O; I! N db 'A',10h,'Testing',0 ; 定义 bytes 型数据区3 V$ X% B! P8 |/ a+ N7 m2 N
3 b; E+ {- W) J7 u
end
2 |) B& o) J0 S$ v& J5 F3 b+ Y
: _) i0 Z4 ^3 ^ G/ ~;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~6 p [/ I* N9 b
8 h1 C7 d$ a y) Z3 M" A) LAllaahu Akbar,
H+ V& w$ O2 h; \# P TRizaPN <rizapn@yahoo.com>
9 _' Y. v- l- BJakarta - Indonesia" v& L( [% h7 J; c0 m
. A3 G h5 @0 _( h+ X
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|