- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:' ? M! ?( B' W5 x
. P* a7 M) B" Q, u6 Z( Z
简单帮助:- y1 \1 U) Q) S6 _9 Y
====================5 L8 R& S( M/ \3 f0 m/ I
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
. O+ R* {& T9 P* ~3 T6 M*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.6 p7 a! q/ [2 `/ k
( L( y$ Q) c# w' g8 O& g0 b9 ^ s% S
搜索空白区:; G N, ~% {9 T% _( Y
=====================
S5 U% H( o7 m4 K7 o Q> sfe 0 ; 帮助9 T8 f( {! ~& q. Z [1 k* I
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
3 t! q n/ T+ w! h, U' X> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间# N2 T3 v, O8 v, B" O
; G" }$ {& [' ]1 m0 ?$ x二进制拷贝:
4 u! E/ O @. B: k7 j" J7 x============
( Y) H& o) S5 y9 S2 D> sfe b ; 帮助
# _$ M6 E& }1 i3 i> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin' [" Z; u! @, m& p* p/ |9 p) I7 d
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
0 w9 a3 ^( @! b4 o# L! v> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
1 L- ]6 K3 M4 o3 D- S; S/ _7 }> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
) L* u1 p( T2 _# c# ]( z9 U8 p) g) X' h* m! j; C; {
比较文件:
7 c* V4 O3 Q( X8 @! B& }5 m==============
7 T9 o: H( q4 R% p* f> sfe c ; 帮助
3 r% }1 @5 D1 x& b! m> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin- t! G3 ]: J, F) g
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
" E5 g- P+ k0 H+ p> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
! t3 R9 C8 I1 ?0 C8 t$ o, k> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )0 I$ Y" `; t# y( ]
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
& q+ C: l0 T7 E8 L4 p2 A1 G> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
1 r* o( W ^+ t7 l> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
/ `- v( D% Q: ?# o9 p
! g0 M1 {5 O4 b$ L8 b发现16进制的地方:' l, R4 o5 f k- o( ]/ z0 E" k% `
====================# L2 p1 B( |4 d$ ?
> sfe f ; 帮助
* E+ }+ {* A: _6 e$ L$ y* [> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个+ k7 n$ v7 C" k
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
! t( @! D7 }) E> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
! S, o. O- v$ @( z+ Z% n3 U# n> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找" G$ m9 F5 O$ r7 U) _7 w4 s. ?3 ^! I
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
3 z0 W5 S* J. ^ {6 x7 v( d> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.6 s+ _7 I2 P) o3 q( F
9 g7 N$ m% r) Z: F. P! w1 G5 }提取语言数据: E: g3 H0 Z5 ~6 v) {, Y& C; F
======================
3 G, `( k0 z/ G/ O( \) G' C4 _> sfe l ; 帮助# q$ ^; ^. R' d+ m# V4 L
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
6 H0 p$ x5 _3 t4 U4 ~2 d> sfe l src.bin 200 ; 显示 ID 200 的字符串, O6 _5 D: n% q1 k1 p4 q0 R$ o, F
> sfe l src.bin 200 2 ; 用第三种语言显示字符串
3 ?7 E! Z/ a7 {8 l. s3 K( X> sfe l src.bin -1 ; 提取第二种语言$ ?2 d3 s& U! |3 z; m
> sfe l src.bin -all ; 提取所有现存语言: Z& Q' g, R2 g) s
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串# h; e1 m: _# i8 F0 y8 @+ L. h- h
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
5 [- X1 A' ]+ o- I0 V> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
. N Z! X( K& \ H4 K( u; }4 p2 V> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
1 C: p9 i: x) h6 g y) P" r> sfe l test.lng ; 检查test.lng 语言包3 h& f5 C& P+ A) r5 ~
> sfe lc test.lng ; 检查和更正test.lng 语言包8 A4 w" K6 ]$ ?* C- c$ R7 C5 z e
; r( L- P" s8 n
提取菜单:1 g% X' A6 U( G/ H9 b& |- P2 N
=============7 B1 Y4 s6 H. P8 t( r8 X6 m) d
> sfe m ; 帮助
1 x7 Z3 r& \! F% |6 }> sfe m src.bin ; 提取菜单结构和入口
* T0 @, I2 T- @4 |# v7 D
4 q; ?4 M+ q( z6 [$ j) {' L: X5 }+ l9 [9 G) Z. x2 R, K4 G r7 }
补丁:* x. p$ d7 F8 B/ R$ p
=========; ^0 H3 I* {: V7 Q; T8 u! O
> sfe p ; 帮助# O' T( g. L6 ?6 q3 {+ C: q
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
4 c* v9 [9 o7 L& F" |' u> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz8 l0 u; c) ~& z0 h
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
( u. h9 n% d' J& \
( {! t1 V+ I. O8 ^+ H5 I8 }1 K O1 H0 f) t; q* u
编译:& d1 }. j9 \2 P% c2 M4 C* ~
==========9 B2 f! x2 b/ Z1 ^" h& M# C
> sfe a ; 帮助
3 `$ N0 Y, b& w& H> sfe a src.asm ; 编译 src.asm+ V/ b! p- Q, _! J$ G
> sfe a src.asm d ; 编译 src.asm, 完整输出 C, H4 M3 P, O
> sfe a "mov r12, #1234h" ; 单句编译
9 w9 E& F, U: \0 ?6 Q5 d> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
( {1 J0 Z3 `0 R7 v9 P7 d> sfe a src.asm,TST ; src.asm编译成补丁格式
( e5 X% i, p3 N9 g0 e* f> sfe a src.asm,TST p ; src.asm编译成补丁格式5 q j0 i( C5 Q; w3 j5 p1 q8 i
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行. g; w% z, c+ Q* X+ |
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000002 u8 o% M* b: m8 [7 v7 o4 k8 Y. h9 N
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。& ^1 q4 z8 F* `& A. h& ?
% Z$ q9 j/ Z+ t2 I, b- u8 { W*) See Assembler Part to get more 'assembler' function detail
( E. a4 `4 Y) E( e5 k9 _9 v5 A! N0 t7 f5 t! ~ R6 m& G
i' {2 L7 C/ d" j5 M4 Z反汇编:/ I4 [8 ]4 k& u' ?+ F
============= P1 `. w" q9 }+ u% a
> sfe d ; 帮助1 S d' ^' e) a, ^) Z
> sfe d src.bin ; 反汇编 src.bin
Q0 ]' L, N& x& E> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin, J& q; I ^+ E
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
- N M2 R, ?0 m# l8 ?> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A000002 J' c! G9 l* j0 y% u' |/ X, Z# C
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
" O7 X3 p/ t7 A, G> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址 n0 ~. {0 I! W& n( j
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件7 w6 H( T' S* t4 l
> sfe d image.bmp ; 单色图形汇编输出
7 h1 N% r8 ~: N> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。# h7 A+ R. I& W% ~5 Z7 N% ~6 Y
: o" h Q/ _& @4 M
调试:8 D; ^1 K' y; A0 ^/ G- }% O: o
=========
* m( p( C* q: _ X> sfe r ; 帮助
8 j& A7 C M9 Q% v# E> sfe r src.bin ; 运行 src.bin
/ n+ t5 L1 D% g6 C; A+ X' h> sfe r src.asm ; 运行 src.asm 汇编文件
( o2 l, O; [: r2 m2 D! z) N> sfe r src.asm ,n ; 同上, 正常输出! ~! m; Z8 i. ]% Z
> sfe r src.bin,200 ; 从 0x200 地址开始运行
# }$ s/ E; l" m w- C0 p5 E> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2005 A2 J4 ?% J( G" m/ e: \- F! f
> sfe r src.bin b00000 ; 以 B00000 为基址运行
# S' C1 l+ i/ b& z3 ?- W> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行0 J. x, Z/ b& O3 T6 P; ^ `9 w
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行4 l& S% x; j, A) H# B" x( \
! _6 h1 b% m4 v2 Z( G1 @5 o& I0 W( ^# f8 p: A
交互调试:
$ {( @/ u. j* O======================
+ p) c6 A4 b1 g5 ]2 `/ e; C> h ; 帮助
d4 r( K1 x% B0 j> g a00000 ; 到地址 a00000
1 p: {. a7 n( u0 N5 r- U( C0 B+ ^> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800). G! H, N- i, L; f9 b
> d ; dump 内存 (现在地址)& H, c' w2 e& X! |" H4 `: O
> d a00000 ; dump a00000 开始的内存
* w8 }! u5 R7 c, P1 h> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
, H6 |. p! |% x% h. f> d r ; dump 注册$ U- m6 d, r$ i" I; O' p
> a ; 单句汇编$ m; S) J+ { @; X
> a c7d530 ; 单句汇编地址在 c7d530$ r/ P; V) o1 F9 t9 z
> u ; 显示反汇编+ c7 o) P0 Y# a" C
> u a00020 ; 显示地址 a00020的反汇编6 K5 \% v8 N& R7 q
> r ; 在现在的地址上执行一条语句' t c5 a% R4 d7 n2 U( e2 M
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
1 Z' }. d) h9 v# M> r 0 ; 运行到返回语句
2 s# I' H z1 a2 ]* n0 D> r -c7d580 ; 运行到地址 c7d5806 q9 I! }: S- O: V
> q ; 退出
9 g& R$ d$ a7 c @/ \" ^3 |) b! R7 J8 N& q) f9 `0 K r4 t* U) r
*) 所有未声明的语句都会改变当前地址。
- G/ G9 n' w4 ^5 p# n3 p
, F% s( w6 b! x/ @! R3 T
@" F: z5 {0 l$ s0 r特别的助记符:
" O: [: k3 E# L. X7 e5 @============================2 @8 n" x3 j P0 y: N7 V$ w
*) 所有C166的汇编格式
: v4 Z/ w6 z( u9 D: p*) 分号用于注释 (在一行的任何地方); Y1 O, f) U/ E' y; w6 l5 t7 A
*) 特别的助记符如下 :
. \1 S$ d9 d1 h; O4 s8 r0 D0 g. s9 v #include filename ; 包含文件(各种定义)
- P% K" ?( ^2 M #define var value ; 设置替代变量 var = value3 x4 Z& z) [: u4 i& b
var equ value ; 变量取值 var = value
8 ]0 p* E: k5 l6 T- o db 'X',36h ; 定义 byte(s) 数据区
y4 k3 ?6 r% V# a/ M/ R dw 1234h,0,'AB' ; 定义 word(s) 数据区1 a4 ]: E3 B. p
org ; 设定当前地址
# _# W7 ?0 i" T. ? base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)- [. J6 D* b4 e# R# Q0 _; Y. p
end ; 结束记号8 z0 W! P7 h$ u) A! d
;#name XXX.string ; 定义补丁名称 (XXX)
: j% R5 I7 N$ b& U" `. ~ ' ; 注释将一起进入补丁; _2 j- \# y1 z; }
'' ; 注释将一起进入补丁,加回车0 W- f/ ^1 w7 k' ~0 C+ X
'; ; 以下内容将全部是注释,直到出现 ''
- C' z0 ^7 V, L W2 w8 _4 I# K8 ? ;' ; 注释将一起进入补丁9 I7 p$ f3 f8 l7 q z0 m
+ - * / % ; 加, 减, 乘, 除, 求模 操作
% \$ A$ n+ G* u; d' u9 H >> > < << ; 右移左移操作
9 d; w; |& e! t3 E$ t3 v & && | || ^ ^^ ; 与, 或, 与非操作
6 f8 b6 @$ W6 l4 a val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
: A2 v9 \9 A" { page(value),
% `* F% A' F6 [& x" E pag(value),
8 W) r& }: I2 v0 `7 v4 r p(value) ; 页值 (= value / 0x4000), A0 N- p, [# ^/ J
pof(value),& i: W' l3 A% b) s U
q(value) ; 页偏移值 (= value mod 0x4000)
; Y" I3 p) s5 m9 M* Z" S segment(value),3 R- g: g7 a, G4 m/ g1 M
seg(value),
. `0 b+ A- C7 |( ]8 G' _3 Y s(value) ; 段值 (= value div 0xFFFF)
6 C$ W; G8 f/ A" a1 k* Z6 N offset(value),( q" w0 P. P& E3 K' g+ U
ofs(value),
, S3 P. E4 y" _, O sof(value),
' S3 q* R1 }; G o(value) ; 段偏移值 (= value mod 0xFFFF)
) @0 D, t! @: I/ [; P! ^
+ x, V6 M3 b. x' ]2 Q. ^$ L/ c*) 例子:
0 W. N8 ~+ d; u8 M, Y2 x8 g
& A/ \5 s- [" B! W;--- Testing ---
+ S5 R- \ j7 F/ h/ {! o4 t# a5 o% h4 N: ?
base 0A00000h ; 自动转换文件地址为 SL45 内存地址3 i0 W0 R. j! o* G7 ^+ B9 j
6 f: ?2 l+ d1 [- K
#ifdef ME45
* g3 Z, ^* m _0 J: W9 ~; ] #include me45.inc2 r4 f4 _4 _8 Y: s+ Q6 W0 {1 |
#else
. p3 Q" f y ?0 s; ` #include sl45.inc
5 D' T* R( @% ?$ f #define FreeRAM 37h:3600h
8 E: K. P& O v0 G+ m6 B" [0 c #define memcpy 0c7b384h
+ b7 }, L1 r2 i+ n: J* }6 B#endif1 s0 T9 l3 S3 M0 U* N1 R( u
2 q. s% n7 R6 X8 S. i+ C;#name TST. Test Patch ; 补丁名& e/ y% L O5 M4 ]" L+ _/ A
G, O& T3 k% J) ]
'Firmware : sl45v56' {) N( J- G; B7 ] v0 m: B
'Author : rizapn
7 A. L0 j5 q$ y# V& [" j( y1 |'Updated : Aug 18, 2004
& t: n& Y+ g+ [5 E# f V8 J/ `/ r& |' _2 b8 s
org 0c7e000h* L, k, a8 c; S5 x3 k* a Z$ z
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
) q! {$ a2 ]1 S/ ~ mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
! S. q5 o+ H: F7 N4 U" w5 Z extp #p(data2), #1 ; 跳到 data2 页
7 ~/ d2 n) a4 Z3 E0 e) Y' N: h4 ~! k& E movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
! p4 l' w% W( z6 q callr sub_1 ; 页内调用! l. B# {7 w1 v$ D/ L
movb rl2, #'A' ; 得到 ASCII 码 'A'- a/ J1 ?( j- a# m6 K2 x9 p; ?* i/ [. b
loop_1:& y: B. x. d% i' ?* f% m6 B
mov r2, #1234h' l/ a3 k( p! p- ^
mov [-r0], r2' Q J. S5 E0 E% [6 n8 }/ f
calls memcpy ; 调用段表示的子程序
7 h# F2 ^. M+ K: A: X: W2 v add r0, #28 V) [9 M) Z7 H% h) h) {0 W
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处4 P% B9 a* P& I- w: l, N
rets
9 i# L; w! f* v! g' M9 n' ~$ m, Q$ N" |) Q0 b5 q5 ^
sub_1:1 X0 u* _# F. c# L7 }$ y
mov r4, #1234h- v% f# ~ ~. Z3 y: i
ret! J) O, ]0 q( Y/ t
- \0 J7 n ?6 s4 C- Y. J1 \ rdata2:
, @5 O! g) i& r O, f- ^, a db 'A',10h,'Testing',0 ; 定义 bytes 型数据区7 \9 I' h. |- h+ M2 R- x) c
" N/ l+ ~$ @. z
end
! d" u+ O0 _: ^9 G. O% W9 S8 m% D9 _+ K, C. R3 q( b7 q
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
: y5 b( E) t5 n x: v) X8 Z, E: e) ^1 G9 R) ~
Allaahu Akbar,
% w* W1 W: Y5 |" F5 iRizaPN <rizapn@yahoo.com>5 x* f/ X/ T4 L6 | O3 C! ]
Jakarta - Indonesia
3 P, [8 g, a6 e4 s$ l3 E) C# s0 k! u3 ~. z, }) @8 j5 x
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|