- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:4 [0 a2 L9 I8 I; \0 r: c
: G$ r1 c: A( v6 n& [) K: y简单帮助:
0 J; E! O2 m4 C1 t6 ], D8 f====================
1 Y' C6 p; e( m/ e: @4 G*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。$ A6 l- ?5 T9 A0 M
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
' I$ \ C- ]3 S9 c+ p+ m
" o- _. i% |5 H" F/ R6 p
+ ?6 e) p1 b% R* k% ]$ m1 F搜索空白区:( U& Y# d6 L0 N& L% U8 S4 `( A
=====================
" n+ I$ K' c2 H+ x> sfe 0 ; 帮助
) r Z3 ^! k" D> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
; C# y" t# u4 b> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间! S: K3 N. A/ h: p- C
, s1 J; }9 c% N7 I0 N二进制拷贝:1 U' C' S* A, K/ |/ M5 j
============
% j; _; t& [. |: M" r> sfe b ; 帮助7 n2 l9 j8 V$ ]# _4 j/ I. M4 P
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
2 @( v2 g( Q6 ?. \( N" B7 f> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin6 z/ x2 N8 l1 E4 n( Q, j8 `
> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
3 F* }* f3 i: \0 Y; u> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200% q6 z6 N4 t8 ^# z- W
\4 t4 e8 n$ {% _
比较文件:& U( k7 N! _2 W/ s5 }7 G) a
==============
% ^ e# p9 F9 X2 `! }) k+ e: S! G> sfe c ; 帮助
/ @: J% L0 G* [) y4 o/ H. G" {> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
2 V* v q( x( R: l> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
! Y) [1 @# g1 i! L+ w> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes4 O) [2 e6 ]. d4 b$ G0 p! b, A
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )8 t* Q3 J) ]+ W. K8 b
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000, }* u$ @% F8 J7 }, B
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes( g2 Q2 j1 {/ d
> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)1 e! X+ k% k: I% h4 W) w7 u$ }! c
+ f# O, N$ ?4 L. o+ Z9 ~
发现16进制的地方:3 N" [. x" ^5 W
====================
0 \7 Y2 ]& H1 m8 f. {- h> sfe f ; 帮助
; O8 z6 m- F' ^5 b# o# @9 [) E% @> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
& ?; C; p( v Y2 g) @> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找 c1 ]0 w" w5 b
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes) R& a: T( \/ p) N) i( l6 ~0 D" v
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
2 U0 _( @+ S/ p) L# @> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
1 [2 }( ?% E# B( p) B6 J> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.
0 W) i7 I+ z' p: A s7 |
$ r5 B' h. v/ J! P7 x# O提取语言数据:
* A2 g3 Z. o5 Z" `- K======================
/ y/ [9 w! S! p8 g6 @9 {9 y# g> sfe l ; 帮助$ ]& X! a* J' v* q. q2 N! u* E7 E# ^
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
8 {: Q" A; ?0 I> sfe l src.bin 200 ; 显示 ID 200 的字符串: Q; P7 h0 i8 H3 S
> sfe l src.bin 200 2 ; 用第三种语言显示字符串 o, e- c( F0 O
> sfe l src.bin -1 ; 提取第二种语言
+ [0 t9 I1 @3 |5 e% [9 W& }> sfe l src.bin -all ; 提取所有现存语言4 I j" J; V( }2 _) k5 f
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串1 N2 V* S9 j. V" ~
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)1 o; t9 T0 }; N y: `6 j2 Q
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
( s; l* V8 S* j> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
9 U5 X% N3 ?9 T( L3 A> sfe l test.lng ; 检查test.lng 语言包
+ S, @. F8 [1 p, U. Z6 A> sfe lc test.lng ; 检查和更正test.lng 语言包
5 o* S' ~! V' G- ^# r9 z: T' c, G
提取菜单:
/ D" ?6 o- [( W' b, x=============, A0 h9 b. ^6 u+ c
> sfe m ; 帮助
1 H3 q& W; T1 v+ N" E! I1 L> sfe m src.bin ; 提取菜单结构和入口
5 N1 C! i: U& V, }8 _
+ h8 Q* F! x k9 X5 X
& r" p9 d+ M! J4 G: x- s, s d: Y补丁:6 R* ?8 `/ w1 H% j
=========
- `8 A3 c: V- B) T8 c9 M. T> sfe p ; 帮助
2 H( d' M, H3 W" A1 V> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
0 ?8 d: G6 u8 |/ y' }: S, r' Q> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
) ^4 }' p- m0 O8 @" ~> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz ) N" [& b" P2 ] W H
$ x* t8 l# l( O3 d7 Q9 a$ B( U, w. E( s3 ^; q' a+ |/ p' p% V* p' i
编译:
% S& p+ w% B; d7 H: L==========
7 r& y$ N) v2 g1 O$ _; P( q> sfe a ; 帮助
; O! _+ \) s7 R N( h7 b6 b- d> sfe a src.asm ; 编译 src.asm# k- ?4 {% W. ^! z/ M
> sfe a src.asm d ; 编译 src.asm, 完整输出
% F) R: F3 N/ n0 n: r5 ~> sfe a "mov r12, #1234h" ; 单句编译+ n8 X% ^7 V+ [/ C) ]
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译# d9 t' B# }; c( |* c
> sfe a src.asm,TST ; src.asm编译成补丁格式" a: u3 R/ l) i/ Z3 }
> sfe a src.asm,TST p ; src.asm编译成补丁格式% E& _4 |, t" u9 i7 k
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行! l1 w: i: f& O& J. P( D: O
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
' D5 X0 ^ g9 F4 |! S7 k+ Z> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
0 Q/ \3 ]6 D* D; V$ [! `7 O" B& p( G4 N+ Q/ ?, T& e
*) See Assembler Part to get more 'assembler' function detail
% G; x) l) `6 q( q- V ~+ f3 p
; K9 W6 a I# L v1 y4 R- z) ]" r8 k e. h3 ~' F, ^; s
反汇编:3 O2 c6 h0 U4 Z9 i& A9 }
=============
, f/ U+ d8 ~' m' u$ k> sfe d ; 帮助
, S5 X2 X! ~8 j2 B% m3 [8 T> sfe d src.bin ; 反汇编 src.bin
7 }7 k+ x* l/ T2 B> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin
! e* o5 J* G! S. P7 E" M$ f> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
]2 g0 Y' G' u5 K# e5 q+ J6 j8 u> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000
( F% K; a: F6 ^- h+ E> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止6 z( r( F- z! B' v/ I! u9 A
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
" {" x% Q0 v6 I* X7 m) B% z> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件- W: l) |* r, z( ~) c
> sfe d image.bmp ; 单色图形汇编输出" L |/ j5 o% N5 D2 ]( o
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。* |# q1 f$ M, j& F8 b
: ?4 ~, n8 \( @0 _ N/ y3 H+ ^$ Y
调试:% w. E# K' L4 r$ A
=========
+ B1 m1 y' N1 l9 ~/ b> sfe r ; 帮助
' F$ I5 N0 z7 f! z6 Y4 ?: F> sfe r src.bin ; 运行 src.bin
$ V) n0 N# x! h7 O, w4 ]) ?> sfe r src.asm ; 运行 src.asm 汇编文件
& A" A0 d7 W: Q# l> sfe r src.asm ,n ; 同上, 正常输出
9 _" `+ x5 t5 @2 Y4 d l; a> sfe r src.bin,200 ; 从 0x200 地址开始运行8 D' Y" k; d+ y
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200/ @2 Q* D' w! \3 h; ^
> sfe r src.bin b00000 ; 以 B00000 为基址运行
% f+ w6 E( K2 r3 B( h+ j> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行 B' ?$ ]2 ~% t6 x% r9 N* q$ n
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行0 w9 L- B6 @/ J) N9 P
Q @+ y5 _- V- p7 D N
- T3 S5 J0 q& w交互调试:
7 f* P' H' f' k! f4 h======================/ C d" }: m( w/ m0 I
> h ; 帮助
1 C2 c. \: ?$ [2 E6 T- i% O3 E% w* s> g a00000 ; 到地址 a000005 E9 R' |/ w( c9 Y
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)) V. R- r/ x9 j" j8 W9 L
> d ; dump 内存 (现在地址)6 D: E: m! q' o( J
> d a00000 ; dump a00000 开始的内存
- C$ R& K: t( w6 F- v* I- K> d a00000 200 ; dump a00000 开始的内存, 大小 0x2006 s+ Z0 x# ?9 |0 Y+ B9 k
> d r ; dump 注册 T6 O/ r( Q" }
> a ; 单句汇编
- D8 w" h+ f! M# R! ]9 I" d5 y> a c7d530 ; 单句汇编地址在 c7d530! U; g* e4 G# M$ d' a- G* p
> u ; 显示反汇编 _& B+ D) _8 v- V! X) e) H
> u a00020 ; 显示地址 a00020的反汇编& d0 g% {) c3 G% r6 b: S
> r ; 在现在的地址上执行一条语句5 B9 k" Y3 m" L5 p' J; t j
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)! J/ g0 `# H% g% F# U4 {* P
> r 0 ; 运行到返回语句
: z0 P+ m) t+ O6 f2 D) A9 p: K> r -c7d580 ; 运行到地址 c7d580
3 S3 x* C; {! f/ J: @> q ; 退出8 v, G5 g0 b. v* N% M u
! B; e( k6 M$ A3 I! U*) 所有未声明的语句都会改变当前地址。5 W% C" y& e0 z2 ^8 H
$ [' g' N' @3 m" e. O
& z) [' Z- \1 k# c
特别的助记符:
3 ?1 x$ k0 L$ o============================; d! ~$ A4 v- w* O2 M2 h5 f
*) 所有C166的汇编格式) h, o" T( m+ d" V8 ]5 c( d, h
*) 分号用于注释 (在一行的任何地方)5 ?, S- [- a! b* X; x7 l# x
*) 特别的助记符如下 :) S8 Q3 ~$ {9 m7 w
#include filename ; 包含文件(各种定义)+ G7 x/ V; s9 B
#define var value ; 设置替代变量 var = value% Q. _$ X# A& F8 V2 S% L
var equ value ; 变量取值 var = value
5 U" v# j8 e) i/ _- t' T' y db 'X',36h ; 定义 byte(s) 数据区1 e- _% `/ e2 A
dw 1234h,0,'AB' ; 定义 word(s) 数据区1 O! c2 I% j s! A! u
org ; 设定当前地址
( p" s8 M9 O* S" D base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
. O4 V+ P5 E, i- y* Y end ; 结束记号 |1 ?9 c' |5 M: f9 t
;#name XXX.string ; 定义补丁名称 (XXX)
" g' S. e, y% Q1 B ' ; 注释将一起进入补丁$ ]3 H" V. ^% _2 I9 g+ x: Y! h$ h
'' ; 注释将一起进入补丁,加回车
/ X! Y; T* f; a '; ; 以下内容将全部是注释,直到出现 ''5 B$ w/ ~: m. d! s) t
;' ; 注释将一起进入补丁
; B% k; m; ]9 X# @ + - * / % ; 加, 减, 乘, 除, 求模 操作0 }# Q9 d$ H5 `6 d6 j( P7 W
>> > < << ; 右移左移操作; r5 T" g& C$ c. D: |
& && | || ^ ^^ ; 与, 或, 与非操作6 p# d# Y9 W* g1 o4 E/ G& W* i
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
H. R4 o& @9 F0 c0 k5 g& f page(value),
# B+ R4 c& t# \ pag(value),$ O5 n' ^' N! D0 ], w
p(value) ; 页值 (= value / 0x4000)
1 l9 h, O0 [2 \ pof(value),3 W" h/ \! E( Z$ l0 l. a [3 a
q(value) ; 页偏移值 (= value mod 0x4000)1 Q! T0 ~0 z8 ~0 Q# u' ]
segment(value),+ i. C1 F& b- X5 c' M
seg(value),
( L5 Y" k2 m p6 N/ Z9 l6 w s(value) ; 段值 (= value div 0xFFFF)
4 [; ~# I9 Z$ z offset(value),
# ]. M) r# b6 |5 E* s; @ ofs(value),8 C9 J8 ~+ b* n3 f' G+ b
sof(value),
, s* S! O9 a5 _9 d( d o(value) ; 段偏移值 (= value mod 0xFFFF)
. X; @" p- G( B' K) t- n+ J. L. Q7 J/ ^* a; K
*) 例子:
/ K2 h2 e4 W0 Q! O# A- H( U
; t5 G5 R$ ?& A& b' O4 Q8 F* n;--- Testing ---
" o6 A+ U! z9 g& T7 ]
& ?% {2 s( A& U' {, q" E( sbase 0A00000h ; 自动转换文件地址为 SL45 内存地址6 i& V0 K( k5 p/ _* ~+ k9 k7 V- `
* j# Q b9 y) k! E6 ]9 N
#ifdef ME45
' J, |& j% d" i) V2 Y' ` #include me45.inc; Q. J" m5 k5 t4 m3 b) t I* u* Q
#else o" }1 n9 b& k: w; J% ^. Z* z r& z% }
#include sl45.inc. s; q2 n- r3 G8 Y. O
#define FreeRAM 37h:3600h, u/ P8 S% y& \3 J4 L% u
#define memcpy 0c7b384h6 ^& j. E: @* G+ v" i/ w
#endif5 j N b) f$ x; B$ }5 ^4 V
- Y* Z! Z+ S8 x% `" t% n% @
;#name TST. Test Patch ; 补丁名
& y9 e* h# D2 K# o4 O
! x5 L. T4 l" ^! {8 _, t) D6 u'Firmware : sl45v56
, O8 m$ l# D% v: r'Author : rizapn8 b7 _8 {0 Y! e6 `- O1 B2 F
'Updated : Aug 18, 2004. T' Z \# R$ s2 i! P
; U7 O9 Q. ?2 p, M5 E \
org 0c7e000h5 r; | r% L3 Q+ q
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
% f. h- h# o9 O8 l, _ s) z mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
9 e9 m7 a. X P8 O M9 D( e& m2 Q! [ extp #p(data2), #1 ; 跳到 data2 页3 G- G" X2 n% L; n% I5 d0 M; t; Y$ |
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
+ N6 j# g7 X& t: h) i callr sub_1 ; 页内调用
8 ~# j* _7 I' ~ movb rl2, #'A' ; 得到 ASCII 码 'A'( j: p5 B m7 Q9 |
loop_1:
# g3 P+ p8 B9 X( z, h4 p" D Q) [ mov r2, #1234h0 g$ A# j# w/ o( b% [- O# w
mov [-r0], r2
: h3 [1 X1 B$ U* Z* H+ d% K calls memcpy ; 调用段表示的子程序; S: q& G) m3 K0 g4 q" \
add r0, #27 J3 o, h0 S4 S) D9 N# l
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处' \! O+ L$ \2 e9 [, T
rets$ e: ^, t; V" O$ r
9 m" |- v, u: O( S* [
sub_1:: z- \+ Q" |4 E R! u$ U. E
mov r4, #1234h0 n; i4 S( P7 F# ~
ret5 d7 a3 p. E/ X" p5 i8 j
' w c; [( y, k% H6 p, d3 d
data2:
( E/ L2 z' Q8 W( N db 'A',10h,'Testing',0 ; 定义 bytes 型数据区6 [3 I# V# N" |( v
- t/ @$ c, n0 ?! {5 z! rend
9 \( D6 w; a- b# p0 G5 {
p7 r, N$ k1 g' P/ ?7 G;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4 x. U e ?: W2 c7 J
0 V( _( _7 @$ b$ ~2 wAllaahu Akbar,
9 {0 a u; q& R- d$ j, \RizaPN <rizapn@yahoo.com>4 d% I, o6 ]3 V
Jakarta - Indonesia2 W) M2 o8 u. k, E
7 Y& |; |' \& p1 m& H: ?
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|