- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
* Z' u3 c& `" A; K
4 `8 h0 P8 X7 Y; d+ ~简单帮助:
9 U. |! `$ L3 }# F* q) V: i" o====================; d& D" e" j: G5 C
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。% L7 t3 q* N* e% k2 s: q2 b8 a! x
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.& W& S, Y1 n) m. `$ D
! U5 g! V8 F4 `! [) y6 H& i, Y1 W
! u( h$ W8 k L搜索空白区:/ s8 ?$ Z; R F Q
=====================
$ E5 |+ ~( d1 P- F! u$ i/ H> sfe 0 ; 帮助
4 c& N3 W. C+ t9 e/ W6 L2 R; T# X> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)7 T* u' b0 I- W. x- b
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间4 W. m0 V7 E+ V# R
- M! s4 l5 R, S二进制拷贝:
6 N/ x r* u5 M) E3 {' J% t============; D5 k0 v% X' T: x9 i
> sfe b ; 帮助
) n# \1 ]4 b% E M6 S+ \( F> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin6 T0 d& S& g# l- E5 h
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
0 ^& g1 e+ l/ n; T( l1 Q> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
+ a/ t! d. v6 c> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x2001 c7 _) O1 Q8 d( Z2 t! K
5 q2 b) U0 P+ z; N" E# ]9 y+ E m
比较文件:$ ]% x6 N9 R- F0 w5 \1 z( K0 u8 G
==============
- I4 R; S: u- l1 t/ @/ K9 j> sfe c ; 帮助
3 U( @! V8 j2 b> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
% h" @4 T/ s1 I" Y9 |0 v" v. F7 j> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )* s. }. c. K! W; G
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes' R* a7 g- `: J8 o
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 ): R* y6 `% ~' k" D
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
# s- X8 c$ ^4 h& {6 \> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes2 Z) n/ o2 y5 K( A8 u; M: l
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)! q6 X Q7 ^1 i* P2 a1 W3 g% |
9 P9 ?7 K ~7 u! y y/ f; F3 ~ x+ f
发现16进制的地方:
- N: L/ Z& `% w' K8 u6 [8 y====================
: N" T9 j( F) `( D1 d% [1 g> sfe f ; 帮助
4 A9 y4 K7 B \) F> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个# u- |* D0 u2 H2 Q7 p. P+ }
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找- S- U$ p4 X: M! n: l
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes+ p. Z; i/ M2 p9 }
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
% O" k- Z' x% ]# g> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
3 F e7 N9 g: {1 I) d4 c> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes." Q8 f7 a; }; J7 x( l9 P5 B4 z
) [* Q# @9 E; S F提取语言数据:
( l' q& f3 m. Y# Z======================
& B7 c3 y9 T& L7 h# Z7 K g* s! M5 s> sfe l ; 帮助
. |; b: ? o2 p1 u5 m7 s! ]3 h, B t> sfe l src.bin ; 提取第一种语言,包括扩展文本数据. c5 s8 g3 w8 p9 p. k* A: ]1 E/ {
> sfe l src.bin 200 ; 显示 ID 200 的字符串
4 I! h) g% L: `> sfe l src.bin 200 2 ; 用第三种语言显示字符串
! x: J5 i6 e7 [) {2 O4 ~0 r; O; C> sfe l src.bin -1 ; 提取第二种语言
8 Y) Y% L. |5 H8 D5 \> sfe l src.bin -all ; 提取所有现存语言
/ y4 U1 M5 Y1 [) ], k+ ]' ^- w0 ~6 i+ H> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
0 z" n3 [& ]1 s2 g' m> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)) n) ]& T& F8 S" m& G4 u
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
# M- @2 P& F2 n n- E> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
3 }4 t I) C0 d> sfe l test.lng ; 检查test.lng 语言包# _) L* k. L( S- |
> sfe lc test.lng ; 检查和更正test.lng 语言包5 l! } s+ b/ N6 k
" \9 @+ F7 n. {' l& |& k
提取菜单:& T. n: l( M# T: k- G% l
=============
9 b3 J5 z% ^: o9 ^> sfe m ; 帮助
Z2 W: U0 _) ^, I> sfe m src.bin ; 提取菜单结构和入口# i8 u2 ?1 C/ |% H# l
+ t6 v7 x& p# k2 s( d
{) J) ?4 Z+ B) ?; F6 Q% k补丁:; z. H; l3 ?* b! ^
=========' J* Y: l# K. @ ^: n# K! E5 o% j
> sfe p ; 帮助
9 [/ ^1 D3 l, G* r> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
" G2 Y/ |# t# f) A( Y7 W> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
) H( U& J+ ]" o> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
6 H+ m; O6 W' ~3 P7 H; i6 L& u. x. L
9 B3 W' L% ^) e d+ \1 z5 z编译:1 X' k1 c5 P; V2 a9 V! v6 k
==========) f1 y* b: b8 l! x/ g( O0 G3 S
> sfe a ; 帮助
* O$ I5 ^; m* ~+ {> sfe a src.asm ; 编译 src.asm
2 }; E0 G" u# U3 t4 {> sfe a src.asm d ; 编译 src.asm, 完整输出" |' b0 z/ ^! s: J+ `2 N
> sfe a "mov r12, #1234h" ; 单句编译& l+ \3 B+ t/ `! ~4 y0 e: w
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译1 y( Z. J$ _, r _0 m; e/ A" d
> sfe a src.asm,TST ; src.asm编译成补丁格式1 S6 i5 F8 C2 |" x$ J0 M# ?
> sfe a src.asm,TST p ; src.asm编译成补丁格式3 @7 G* a' o6 q4 T& g
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行# h+ V& m" d: P' w: N% ~
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
" S! Y: B/ Z+ I5 D% M> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。3 Z6 \9 ]0 O- D4 r; v+ P
+ U$ w0 u2 U' d8 W4 H( j
*) See Assembler Part to get more 'assembler' function detail
9 w, P' Q# M3 A/ H8 b. ]# X3 B6 t: M* H
) @; K; c2 j/ z( m0 y5 ?3 F反汇编:; q& H1 }4 C4 E; F2 \/ F! V
=============' I4 w3 }9 |0 u# l V& u) w
> sfe d ; 帮助- g2 s' ` O' f' t3 k) o
> sfe d src.bin ; 反汇编 src.bin
8 _& C; y) j; M; |1 p f> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin+ `1 u9 J+ \% m
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节( e) e& X v2 W
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000
: |; ]8 }+ R/ T j5 Q> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
+ U+ A2 |& h4 r; e3 E> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
- K. D& T8 ?1 z7 x, h1 d3 E) c> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件9 a/ M" y9 ]! B. J% X; A0 r
> sfe d image.bmp ; 单色图形汇编输出8 D5 m2 T( T8 t7 G
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
! d. i# }6 Q7 C; W6 ^
& }! g( ^8 |) D4 b$ o8 |调试:
' N; b- p# ], V4 k, D) H8 \=========
- O/ s9 f; C+ G" I5 @/ w> sfe r ; 帮助9 u+ f$ a: ]1 C3 h/ M) l9 p( Z
> sfe r src.bin ; 运行 src.bin) K! \4 O: s' h) c
> sfe r src.asm ; 运行 src.asm 汇编文件- c* M9 c9 a( h9 L' E1 t( _: a
> sfe r src.asm ,n ; 同上, 正常输出
) P' ]$ ^: ?4 ^1 [- C. C> sfe r src.bin,200 ; 从 0x200 地址开始运行2 o: i- I/ i2 r
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2006 w' G0 c; e4 Q# |4 H# d( O
> sfe r src.bin b00000 ; 以 B00000 为基址运行- O$ b' e+ d/ ^ V* J, i' U5 M
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行) F) m( V4 k+ }0 |
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
+ x! m" k& i/ `+ e8 w" ]* b
4 b% E3 o0 Y1 V" c! G5 g& i g) q2 s8 H0 a; f$ I% ?7 ]1 y
交互调试:
# U- z& H" p3 R( Z======================
: q" @6 U! H6 o# w$ V" R> h ; 帮助
4 N, J* l$ K( f' \- `> g a00000 ; 到地址 a00000! X) k" X, h" X( \3 w. y, |" w
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
; w1 E2 X5 k9 I> d ; dump 内存 (现在地址); J& ]! K4 e" G K
> d a00000 ; dump a00000 开始的内存 @ [3 Z; J- v" l1 I
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
' E- n* J3 `- A4 Z2 |2 G> d r ; dump 注册: I+ m' _& @3 i4 d1 _1 a
> a ; 单句汇编
4 R* W0 _- \2 M0 \3 G> a c7d530 ; 单句汇编地址在 c7d530
+ n7 F5 d; j+ |5 j( t7 Q> u ; 显示反汇编
2 M- A' e2 a6 ?- O$ s> u a00020 ; 显示地址 a00020的反汇编* [. p) P4 Z9 Y1 D8 d* n
> r ; 在现在的地址上执行一条语句& c5 g2 |- u: X" ~! @' J
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)" y: R+ _. a7 Q, K
> r 0 ; 运行到返回语句
$ W! y7 B3 X b% s# [7 V> r -c7d580 ; 运行到地址 c7d5808 y Y3 I+ ~% l6 k! `
> q ; 退出$ [ e7 {$ M m! t2 y- i! o
% j. w; }1 e8 x4 e7 q+ D) ^
*) 所有未声明的语句都会改变当前地址。) ~6 O' d9 r; R: z, H# R- T
# i3 B( ?! F& `1 f, q4 J
" I$ X4 E" q- \, @8 M2 E特别的助记符:
( W& V4 k" d% J9 u! U============================3 k3 s( i x+ J4 c% a; X9 K+ q
*) 所有C166的汇编格式+ m7 x0 \3 ] a# w
*) 分号用于注释 (在一行的任何地方)6 O, i- ?& Y) y! r5 n/ _' u- I
*) 特别的助记符如下 :/ r9 a; e8 n2 Z6 Q; x' Y4 q
#include filename ; 包含文件(各种定义)/ j0 `0 L; l" e- Z6 z7 C) J, U
#define var value ; 设置替代变量 var = value1 }, O1 L# n0 y% U9 J
var equ value ; 变量取值 var = value2 r. U2 L" i! I' O2 N
db 'X',36h ; 定义 byte(s) 数据区, Y% W! @& b$ C. N$ h( A
dw 1234h,0,'AB' ; 定义 word(s) 数据区
" x4 G. E! p0 ^ org ; 设定当前地址
1 e1 z, {+ [# _/ \. A base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)3 F" V/ N8 L4 u; b$ G: l
end ; 结束记号+ X% e. ~) d! u" v( k' f
;#name XXX.string ; 定义补丁名称 (XXX)1 j- X/ |6 _/ C; s
' ; 注释将一起进入补丁
' G T; r" O8 o% \+ j, F' a6 i" b '' ; 注释将一起进入补丁,加回车4 E+ ]3 E& t& [5 X0 f6 B
'; ; 以下内容将全部是注释,直到出现 ''$ I, _8 W" [0 M; |+ C3 X9 d0 `3 d
;' ; 注释将一起进入补丁" G' t8 n4 e2 W" |& g2 J8 o1 O4 n
+ - * / % ; 加, 减, 乘, 除, 求模 操作
, |* f' w% n7 e. x( a) [! a# y9 L >> > < << ; 右移左移操作7 e( R- }; J; {9 ?3 u7 X
& && | || ^ ^^ ; 与, 或, 与非操作
# Z( M' S; r7 n# L& d. @ val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)0 w( W; N4 `" K- W' O& r% k
page(value), # r! W {) x: [( q2 o
pag(value),6 K" m* }6 x2 R0 g' n$ ] v
p(value) ; 页值 (= value / 0x4000)
5 U' J5 ?" H( P0 a" L8 s# ?$ _ pof(value),
2 n) }7 Q0 J/ |2 d. r. f# M q(value) ; 页偏移值 (= value mod 0x4000)
. ]' F8 |& W* c" T* F7 f segment(value),3 N" [: c, u ^) S. F7 F( o/ y
seg(value),1 T0 h/ |+ E9 t3 H
s(value) ; 段值 (= value div 0xFFFF) j1 r: ?, l, L# \- O
offset(value),
) {# ^0 p' s- ^# g+ J. L ofs(value),
" i1 y2 i- _! C2 Y sof(value),
3 W* Y, H# X |3 ~/ s o(value) ; 段偏移值 (= value mod 0xFFFF)
3 _3 \- X+ e7 u4 x. I; |* W. K6 w7 { ]' C7 b% s, H, x2 C7 z
*) 例子:
: U% H! Z1 r* i0 E; o; K: `- g2 _7 P: Y9 }7 A0 Z# F
;--- Testing ---
' Y6 e8 `4 _4 `
: Z9 R+ f8 ^# o& c% O5 c& C' cbase 0A00000h ; 自动转换文件地址为 SL45 内存地址/ w; S# r2 m, X; z3 V/ G7 z" T
& ~4 Y# H( o$ L* D# n
#ifdef ME45* ^* d8 d$ Q) B; j
#include me45.inc5 v/ ~' `+ E8 j0 X5 H/ Y% m
#else( N8 I8 g0 N m
#include sl45.inc! e5 ]( K j+ |& b, O* B
#define FreeRAM 37h:3600h
9 K4 k1 t4 V9 I) ~ #define memcpy 0c7b384h
+ Q8 J g, B0 S#endif
0 G5 W/ l. c# e2 h8 I5 x
' z: W+ c# l* x! h;#name TST. Test Patch ; 补丁名
& U: `. Z3 a1 o) T% B( P
3 x( F% S2 B7 u, _'Firmware : sl45v56) J6 k; O9 n2 A+ M
'Author : rizapn5 b9 C6 p& L4 ?6 a# g8 s( F, o
'Updated : Aug 18, 2004. H/ o3 s0 f9 Q5 T
2 C4 F q. |4 s: J/ R
org 0c7e000h
" U4 S% ~) ?- L, c2 R. X mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
, d$ Y- u- J" L6 x1 b% e mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值5 m' e/ J: q( ^# \8 l
extp #p(data2), #1 ; 跳到 data2 页
4 f4 @1 a4 i x( O4 e/ ^; C movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
! o' Z: ]) v- h$ T/ T$ B+ x callr sub_1 ; 页内调用; n; x2 x2 h% Y( _( x+ D
movb rl2, #'A' ; 得到 ASCII 码 'A'* s" G0 N' j# @( ^3 S6 p
loop_1:
, b' l. h L/ e4 \% w mov r2, #1234h! y) f+ i1 F, p
mov [-r0], r2
/ _+ i* _" ^1 J; Z0 i calls memcpy ; 调用段表示的子程序
1 s1 P' o* K0 y. `3 X! |( S. ] add r0, #2, S" T/ l/ G* Y: d# p- k, [
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处5 Q' L. r2 A2 b* P8 L6 g
rets
* ]" G9 l4 q8 w) Z. N/ t& k; n/ i6 p' \, A+ T' K
sub_1:- A+ W3 D+ U2 T1 T7 E+ q T; L- ~
mov r4, #1234h
1 _' G9 @% X8 u1 g5 D# \3 r ret7 \) c5 L Z$ R+ c# W' k- d
8 x) U' l' a) cdata2:
! s: `0 e1 n' y5 M db 'A',10h,'Testing',0 ; 定义 bytes 型数据区 V2 U) h. K8 m( u0 o
6 G9 G$ x. x) `' i$ r! Yend
S% z/ z8 S7 K: ^! e* s' x0 F9 y+ y& d+ j
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~6 U p" ]3 n. k5 v R
! K! X$ a" b, q. AAllaahu Akbar,
0 q, C: E" Z7 TRizaPN <rizapn@yahoo.com>/ L y8 ^9 F5 g, ^( E
Jakarta - Indonesia* @" }' I$ m) N7 j; V% c* Q
& w; B) T6 I/ k Z2 V1 T4 H3 k
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|