- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:0 {& q2 v1 @4 N$ C# S2 Q* c
7 h/ {% Z, m: L5 U9 t& f+ e+ |
简单帮助:
% m9 h( S# ?. |6 N. d====================$ d0 o' Q' ]9 w+ X5 F, W
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
+ V& v7 r4 R) x. ?# V*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
8 z" M) i4 n5 k( _# p7 L
Q: d4 Z( G' L1 C. T" F, E' |6 c7 \7 N( c& J- P
搜索空白区:2 o- o8 a9 I( p6 T/ }6 Y7 u
=====================
. l1 E% N8 Y6 z# f2 {> sfe 0 ; 帮助
! G3 P4 ]1 i' h6 b> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
( a7 T5 V b1 H> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
& n# } y: `$ S5 V3 m0 \7 T+ T: c' P$ j
二进制拷贝:
) |- a$ B% `( k3 x! h# }============- W! \% n3 A* \7 o& f
> sfe b ; 帮助
, S6 z% K% ?8 j% A> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin+ { B6 a' l" y. a
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
6 v' [ y3 c5 m% _> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
8 o1 H# u; J! N! L; N. N0 c> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200* Z% E0 C4 N- }+ ]4 A- K' }
2 P! P% |# Y& ]5 ]2 N5 p( {% a比较文件:, B7 b7 Z6 D: }( C+ S U
==============- e2 G7 }- {5 k0 d4 `# ~
> sfe c ; 帮助
& T2 U$ r2 ]7 P( L' H5 O( p> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin9 E( Z5 }2 g" n3 E$ e; ]$ P- |
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
1 f7 W2 L' O" Q) e" N> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
! J5 ]0 a B8 N> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
! f8 u# ?/ r& B& {* G> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000: F% u9 k# ^9 H' q
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
5 i$ V' }. \9 L: U9 o! i$ r( f> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
% K- D9 v% b. |, y7 s$ P( v/ V4 s- J$ I
发现16进制的地方:8 L( Z& Y ^9 e5 ?) s p" C6 Q7 V8 \
====================3 r" @$ `# e3 h1 G) q# y
> sfe f ; 帮助$ V# N" ]+ Q: M2 X3 |2 u7 H( L5 a% n
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个7 D+ K' |$ q- S4 o
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找3 l! p$ b! t' O1 A$ h
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
. V7 [$ @$ [( g0 I. s# \> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找+ e4 }+ r Q# f0 u. k" m
> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
+ a* J# L; V. F5 A> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.' o, j/ {) G+ ?; O- k* B+ w
* X$ ~3 k7 P% W: r9 O# o
提取语言数据:
$ d) t" }1 B G( k' A======================! ~& G$ J( N. p0 ~; `+ i6 @
> sfe l ; 帮助: b9 M4 g7 m1 A2 b+ I8 d
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
w! D7 l8 h/ `7 a> sfe l src.bin 200 ; 显示 ID 200 的字符串$ X0 ~# T% t5 r! E5 y1 w
> sfe l src.bin 200 2 ; 用第三种语言显示字符串7 y, S( B4 W+ d- ?0 T
> sfe l src.bin -1 ; 提取第二种语言5 m( V( l- J( C" O$ q$ D$ b+ R8 m
> sfe l src.bin -all ; 提取所有现存语言
i7 O2 C( w7 n2 s' ?> sfe l src.bin 'Testing ; 转换 'Testing' 字符串8 a4 @ a; t7 ^3 R" S
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)4 J1 L. a! z/ y- i
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
6 _: X! l0 P" `/ z x0 D> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
1 v' g0 [ G- T> sfe l test.lng ; 检查test.lng 语言包9 E1 g$ _/ n: `6 e' G
> sfe lc test.lng ; 检查和更正test.lng 语言包8 @& D, F' `1 g4 t% P! T0 M5 U
$ f, m- ^& i/ D" `: t, v
提取菜单:& O" e1 q8 r2 I# Y1 r" A2 o# K0 ~0 N
=============- X2 o- L$ h+ J8 h9 U3 L9 J
> sfe m ; 帮助
- C: L" [0 Q+ G6 F& f> sfe m src.bin ; 提取菜单结构和入口7 A4 G7 O8 f d* }7 C
" ^5 s9 H$ r1 o4 h5 m% x, M, d; r/ N6 e% e1 z. |% V. t# M9 p
补丁: \, y( Q, C& [) M. X# E
=========0 ^/ T+ p* [% T
> sfe p ; 帮助9 `! V8 d6 Q1 G) F2 ^
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
' A" m6 t8 B7 s# w) S/ o# E; B+ [> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz$ ~$ ?) H5 u' f( N9 o& m
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz 3 @8 N8 N' T& X
5 H u' ~0 |. _$ ]# n8 f- j& T+ X8 r5 M8 G/ k: k+ E$ ~$ w% o& r
编译:9 K) v+ z# b8 d/ E
==========
! [" E2 Z; g$ n& y+ P> sfe a ; 帮助4 x3 M* V# D9 T4 [& w
> sfe a src.asm ; 编译 src.asm: O$ Z5 y6 o% o4 F3 a* A
> sfe a src.asm d ; 编译 src.asm, 完整输出
3 E8 E6 C$ L- ?$ ?> sfe a "mov r12, #1234h" ; 单句编译, e" V2 y3 p! z' i
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
4 e5 D2 \' W1 L( k0 O' }; @> sfe a src.asm,TST ; src.asm编译成补丁格式
# N' a9 U6 W+ d+ D/ b> sfe a src.asm,TST p ; src.asm编译成补丁格式
0 e# D' ]; W& F4 q% F5 p> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行+ I0 d9 c1 |7 b$ `
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000004 E$ i) ~( Y, d: _6 X
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
! _# p! {3 J2 @; W3 o3 I3 m3 ]+ R$ }0 `& A* T
*) See Assembler Part to get more 'assembler' function detail8 y! X* H; m+ F Z' o9 B4 I* J3 V# t% V
' N4 U' X/ R: r! p. C
( p; j" d/ @! r: F反汇编:8 S0 h+ ]; e7 B% x% {
=============
2 n" @6 g2 u0 D* z& G) ^8 Q# D> sfe d ; 帮助
+ M0 |% Z* A, F, O5 R4 z( ~4 U5 b> sfe d src.bin ; 反汇编 src.bin9 z5 R1 ^/ @9 M
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin/ L; {9 L& a) x" G
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节$ S( C0 n5 g6 z6 V
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000* B _8 I% ^3 O% Q
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止; J1 x* G; X" k2 t; r- V) R& H
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址 \! f c% T- Q" m5 r1 @! e- Y
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
& P% X4 u3 q! a> sfe d image.bmp ; 单色图形汇编输出" W) W4 J7 w& A" ]( n
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
8 r) o7 P/ s: Y! Z6 {7 I/ w$ [' k# ?: y/ x5 A" G( `. }/ j
调试:
9 h0 z( v8 k0 L=========
. v( v7 ^- N4 x% G; D& g1 t9 e> sfe r ; 帮助
2 S% W) f" }7 `. i1 b( [6 O: T> sfe r src.bin ; 运行 src.bin0 } O h/ z4 K+ H& B7 k
> sfe r src.asm ; 运行 src.asm 汇编文件5 |) a, q1 C' g# e M
> sfe r src.asm ,n ; 同上, 正常输出) I) A3 y) S5 u( ~
> sfe r src.bin,200 ; 从 0x200 地址开始运行
' ?- C5 H) j: Z" T> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2009 D0 E9 C$ V% H" [- @: `
> sfe r src.bin b00000 ; 以 B00000 为基址运行
5 [% _7 \" O* p: i( U8 n> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
4 @5 z( M; B& L9 _1 j) ^0 k7 N> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
- n* T; W& g3 W
& S( l& N8 i- n1 X0 W, k) j) X9 d% U4 S
交互调试:
' s( f9 C2 ?8 W m2 Z l- P2 B======================8 Y p6 y. ~. @* J2 A
> h ; 帮助
- l. O1 d0 B7 R; q! H> g a00000 ; 到地址 a00000
8 T0 M( Y, K2 n$ V& J) y> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
2 `9 i/ J6 H4 @, i* ]> d ; dump 内存 (现在地址)
. V- ~" b. T/ W. q) R> d a00000 ; dump a00000 开始的内存
- K. [7 v7 \: E- e t) A+ c' ] u> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
+ [% |; |; v1 i; b! _; z* ~' [> d r ; dump 注册, F( @, Q, q8 p( n
> a ; 单句汇编
2 m+ [# L7 g4 E0 m9 V- q$ a> a c7d530 ; 单句汇编地址在 c7d530% f4 g) Y# z5 c6 `9 f
> u ; 显示反汇编
; J4 Q/ v) i/ M' b> u a00020 ; 显示地址 a00020的反汇编
* @3 g. o+ o |, H/ ?3 g3 i* L> r ; 在现在的地址上执行一条语句 ~& O0 `8 T" _
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
0 d, y" v: Z4 d4 ~3 L3 M> r 0 ; 运行到返回语句
7 b# f( [+ B2 I( g/ _> r -c7d580 ; 运行到地址 c7d580
( T; u( B7 z/ r& v v% r4 Z; ^> q ; 退出
) j, d2 q# }6 l! d r' {: ^9 o* R* q: f: u
*) 所有未声明的语句都会改变当前地址。
1 X6 C. a8 c0 M3 B2 K" r% a' n( S
" N4 z* U( v+ y4 ]
* W9 z% W2 y- A; H& |特别的助记符:0 K* k$ W! g) P
============================; O* R1 v# C% e, Z s& s9 ]6 T1 I
*) 所有C166的汇编格式- F0 g. j' B7 ?& c1 S+ h( y
*) 分号用于注释 (在一行的任何地方)
5 M. u6 f% t$ f$ I Q, w' [& m/ y*) 特别的助记符如下 :# A: W: Q# M0 v: x5 A7 J
#include filename ; 包含文件(各种定义)
7 o( o4 K: w% t1 f7 b( E! n9 u5 @ #define var value ; 设置替代变量 var = value4 }8 N' e) p7 G; s# g. [
var equ value ; 变量取值 var = value
' Z5 U( D' W8 a" f" ]- x db 'X',36h ; 定义 byte(s) 数据区- ?7 H/ A$ g/ a* G. `& x, w
dw 1234h,0,'AB' ; 定义 word(s) 数据区
8 a, f$ `: S+ ]; L9 w: Q org ; 设定当前地址
8 f* q. ] E3 d# U4 J& @ base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)" A# w, `- f) _
end ; 结束记号3 r! l8 [+ |! n- O/ {
;#name XXX.string ; 定义补丁名称 (XXX)( p/ p' C' o9 k2 y; ]. m
' ; 注释将一起进入补丁
$ o7 G2 g" u7 R# u '' ; 注释将一起进入补丁,加回车3 L/ y7 o4 n; ]- v
'; ; 以下内容将全部是注释,直到出现 ''
8 F V# \$ E' L5 X# e) X ;' ; 注释将一起进入补丁
4 t" ]* o+ d$ n0 v: s' a: s + - * / % ; 加, 减, 乘, 除, 求模 操作3 @" o9 w: z% A# v) G: e8 x- v, [
>> > < << ; 右移左移操作0 o C$ |. _6 J/ g# X
& && | || ^ ^^ ; 与, 或, 与非操作
! _0 @# |* ^. w+ P2 R- t% J val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
0 @, m4 E/ L- l page(value),
1 d! q& Y9 m2 i2 D pag(value),
. C" `1 x. S- F1 u/ a l) c p(value) ; 页值 (= value / 0x4000)
5 K3 d# V5 o2 L pof(value),
8 d" y# N ]3 M& w0 I* X q(value) ; 页偏移值 (= value mod 0x4000): l* W9 X6 M: g0 N& O2 o
segment(value),2 I; I3 m& Q' c8 n9 M. I
seg(value),
; j, B1 J5 l$ u6 P2 ~5 i) ` s(value) ; 段值 (= value div 0xFFFF)
0 F& T) V( R `! t offset(value),
9 {1 W* w6 M1 A2 g ?" R ofs(value),
8 n$ |. x6 n, [3 ~6 H( r sof(value),
5 g4 w3 L5 H+ K: _" N o(value) ; 段偏移值 (= value mod 0xFFFF)
' U: o' s! c' S0 w9 q8 [: M6 ~$ _# J4 i4 f! [4 W6 T# w. F
*) 例子:' `; h" @2 d2 I* c* P
$ N# P' M# \. L& r! L5 B& {7 R;--- Testing ---
- X; i: O \- E: l3 j' X% f
+ @$ w# d8 a9 P" K( bbase 0A00000h ; 自动转换文件地址为 SL45 内存地址: a2 R1 G" }1 {" U
/ v8 i2 I: B3 Y7 x6 w
#ifdef ME45! o% w7 ^2 u6 b! h& p& u, {4 V1 y
#include me45.inc
5 r* x1 c R" |#else
3 o* s8 j# M+ \2 D. y' W #include sl45.inc
7 w$ X' q4 l; M+ y+ R2 T0 @2 b #define FreeRAM 37h:3600h; O5 R. ^# z3 _+ @( L
#define memcpy 0c7b384h
: G6 g0 N5 C+ s$ t4 a0 A1 {$ y# H#endif7 ?! ^1 T& T1 u6 y0 u# P2 t' e0 w# C
/ a3 N3 z# \2 L$ h" k8 e8 x. x
;#name TST. Test Patch ; 补丁名
9 S, _( g2 X% G+ E
. j. b- V% S; p7 v4 | S- a2 l'Firmware : sl45v56: D9 B7 Q! O: y1 c R
'Author : rizapn/ n, W" c8 q' x9 y: E; b
'Updated : Aug 18, 20044 z O- k( Z5 c8 v, J
( ^2 R0 [$ C% E2 o* I! {2 x1 y
org 0c7e000h
: {3 k% h$ ?" z# J' L mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
' e/ \% f. _2 \0 z7 ^, \. }: [ mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
8 Y3 d8 X: {2 e extp #p(data2), #1 ; 跳到 data2 页
5 M9 j( W6 ], P4 P: { movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
: m5 R- d; z% |! i5 _ callr sub_1 ; 页内调用
3 Q9 V, v! {/ |- b$ k; U6 G6 ? movb rl2, #'A' ; 得到 ASCII 码 'A'
" Q) E1 j2 k8 e; }5 o0 t- Cloop_1:
/ f' S% s$ }- R) S) B" p/ h mov r2, #1234h
- z, v. m( T. h$ u mov [-r0], r2
9 f1 t$ {. |- q6 H calls memcpy ; 调用段表示的子程序
# J$ o- _! k: d8 | add r0, #2! x! M2 D4 Y; g8 I
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
1 H- T! ^" |- ?2 r% i rets
/ M; }0 O* h! N* E$ ~9 g
" ^! K( w9 V- ^& ?1 Rsub_1:
7 t* N6 y. s' i6 ?2 h. L& d mov r4, #1234h
0 M, O- |8 n- K ret1 y& s+ y% T1 T6 S! L
7 Y) i0 v& H8 Q
data2:" T3 t) H6 Z# p! F' _
db 'A',10h,'Testing',0 ; 定义 bytes 型数据区2 Z: l$ K' H p5 @1 o
2 |* U$ }' U4 }* \end0 @" e) A: x2 M, v
* d) r$ r1 ?& |6 E
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
' e8 {' R2 Z! K5 _+ r8 p8 u* _" Y" m5 W
Allaahu Akbar,5 [+ h: h: }8 p; ]
RizaPN <rizapn@yahoo.com>/ _ ]& c- @( k( B" D0 @
Jakarta - Indonesia" l6 ^/ u5 ?' U) N( W! i9 Q6 |5 [
8 a" |9 x0 b7 N; W+ V
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|