爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 19943|回复: 2
收起左侧

sfe.exe的使用说明

[复制链接]
发表于 2005-11-9 11:58:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
# p5 h& u$ w4 H( Y: I" m5 L+ _7 `8 D- m. v$ o
简单帮助:
  p) U1 s: w. }" S* m0 o) \====================
; q+ T  u# q: _+ x7 {; |*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。" N- F) {; b5 J3 O5 `' ^  [
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.9 o; d! s* G' `* y; C5 j3 l
7 I* r% z! ~, s& C

6 }& V  ^/ c( |( Q搜索空白区:
: b7 U; U# V0 i+ g0 Z# q" ~=====================
3 n8 x% G7 n' m% ?> sfe 0                        ; 帮助  _1 c: P. m  {  E
> sfe 0 binfile.bin          ; 搜索空白区 (默认大小 = 0x300 bytes)! p0 @& j8 J7 n" r8 A
> sfe 0 binfile.bin 1000  ; 搜索 0x1000 大小的空余空间
  k# q; Q& N& I: G: g; g9 J1 n; c+ V4 t" d1 o* `) l
二进制拷贝:+ Z% n6 Z# W/ B& j+ H
============
* K4 X( r) P, Z5 w; {* l9 D> sfe b                                      ; 帮助7 X: C% {2 _  M. X' i1 k% B6 \! m; G
> sfe b src.bin dst.bin                  ; 拷贝 src.bin 到 dst.bin
- Z" n9 w% [2 A+ Z) V> sfe b src.bin,20 dst.bin              ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
; `# U6 J0 @) r" |2 m> sfe b src.bin,20,100 dst.bin        ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
0 F4 n# Z6 `$ g. I; a> sfe b src.bin,20,100 dst.bin,200  ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
( l: y8 C2 X9 }# L! d4 J
; V5 }" O( ~4 h, c+ t( e* Z比较文件:6 T0 g  q, s0 v! T# F6 _% ?' Z
==============
0 ~6 w6 O4 u9 `9 R> sfe c                                              ; 帮助$ ^  }3 r$ R8 t1 ~1 t6 O
> sfe c src.bin dst.bin                         ; 比较 src.bin 和 dst.bin
2 f/ t* K3 t% H8 l! D  N0 I> sfe c src.bin,20 dst.bin                     ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
& g5 K( M" i" i& \> sfe c src.bin,20,100 dst.bin               ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes* m1 j8 B8 i7 r! J# k" w
> sfe c src.bin,20,100 dst.bin,300         ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 ); `. h, h3 r+ v' n) R- y. J$ H
> sfe c src.bin,20 dst.bin a00000          ; 比较结果显示地址加基值 A000003 V' t" v2 P  _3 V$ U% d
> sfe c src.bin,20 dst.bin a00000,16     ; 比较结果显示地址加基值 A00000 每行显示 16 bytes( }& \4 m/ f' e, e! V6 [+ l% }
> sfe c src.bin,20 dst.bin a00000,16,all  ; 两个文件都显示(不仅是不同处)/ A4 Z; T% a! p/ ]1 e. `
  O9 ]8 e; E' m' W; X5 H
发现16进制的地方:+ t3 a, Z9 ]& S7 t
====================
- A; e4 ?1 h+ w. N" }> sfe f                                     ; 帮助
% f, x) z% Q2 V7 i, T> sfe f src.bin e6,f?,,20,e6          ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个2 C) S6 ?- y% H: H5 a1 N& c+ `1 \/ J: e
> sfe f src.bin,200 e6,f?,,20,e6   ; 同上,从 0x200 开始找5 H2 S8 M% h5 t  a2 V" M
> sfe f src.bin e6,f?,,20,e6 10     ; 同上,显示 10 bytes
  r+ t- T+ ?  M  t$ L% R> sfe f src.bin e6,f?,,20,e6 10,4  ; 同上,是反向找
/ p: A  L# [. I$ r> sfe f src.bin 1234                   ; 显示从1234H开始的内容, 80 bytes 大小
$ N4 L; l5 @# w& o" m0 O> sfe f src.bin 100:1000,8           ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.& r' Y6 y6 L. b0 x7 K- @5 I4 O
7 H: k2 {7 B- }' V  P
提取语言数据:3 y1 t) V% ?- t/ Z
======================
$ a; A' B8 C% d  ?& k> sfe l                                          ; 帮助  d2 d1 a% W/ [- e' ]. y
> sfe l src.bin                                ; 提取第一种语言,包括扩展文本数据* t  X1 B$ W0 C# C' x
> sfe l src.bin 200                          ; 显示 ID 200 的字符串& }/ p) E0 m& r- ?* h; n* r8 s
> sfe l src.bin 200 2                       ; 用第三种语言显示字符串9 [- M" i2 r# Q  L* `: S  Y5 x
> sfe l src.bin -1                             ; 提取第二种语言! W% o8 B6 l, B
> sfe l src.bin -all                            ; 提取所有现存语言  C) [5 F% ?( M6 S8 h
> sfe l src.bin 'Testing                    ; 转换 'Testing' 字符串8 D- p% y. s- q( U4 l( B
> sfe l src.bin 'Testing 1                  ; 转换 'Testing' 字符串( 用 ID 1 语言)! |7 C5 u( U! E7 B2 U: V* @
> sfe l src.bin "+41 8C 91 56 4F"      ; 转换16进制文本8 e; n7 g/ p( G5 _
> sfe l scr.bin 200,"<95>Test"         ; 用字串 "<95>Test”更改串号为 200并生成补丁 - E- g2 _7 D( f
> sfe l test.lng                   ; 检查test.lng 语言包) r' |7 ~# }0 Y, Q9 L
> sfe lc test.lng                   ; 检查和更正test.lng 语言包
$ |0 s" z. r0 F& D/ J  n# \* l0 n$ p0 r
提取菜单:
+ b4 M: R# B) N% w2 k=============
  H+ W  X% ^4 S8 _* Y/ f3 c$ u) x> sfe m             ; 帮助
2 e4 p. d. G1 l0 i! f> sfe m src.bin    ; 提取菜单结构和入口
1 N3 ?! W- c( g/ m6 n& d; U% Y( x% ]& O3 L7 D2 \! S* c
* O) ]  p9 F: k$ |
补丁:) o5 z: x1 y; t; v
=========
( [3 @* p  [# F8 w9 W( F& d> sfe p                                        ; 帮助
* d) f  [$ u$ }" M2 \! j* ?+ D> sfe p sl45_44.bin patch.txt 44,BCI   ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin& o! {) u5 T! F9 d  r
> sfe p sl45_44.bin p.txt 44,BCI,u             ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
2 N6 _% s, [# A$ S> sfe p binfile.bin p.txt 00,BCI             ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz $ Y; n; G/ T7 B! s8 X# m2 I
$ q9 J+ F6 ]% z4 x% z
1 `- _, y0 S# G8 Y9 j
编译:
9 a* J8 b; s/ D1 k==========8 R7 O. X$ N5 i9 l; b
> sfe a                                     ; 帮助6 X! \4 n* U# T
> sfe a src.asm                          ; 编译 src.asm
& [& Z  z5 N+ Q0 M9 V- E> sfe a src.asm d                       ; 编译 src.asm, 完整输出. h0 @& N, A- t3 z7 z# c& J' \. |
> sfe a "mov r12, #1234h"          ; 单句编译" B. ]$ X: Y+ ?; a, @/ j8 v/ _
> sfe a "mov r2,r1 ; sub r2,#1"    ; 多句编译
0 D( @! A. V- F( J6 w> sfe a src.asm,TST                    ; src.asm编译成补丁格式
* `: [$ s9 I) f4 s* m  L4 B> sfe a src.asm,TST p                 ; src.asm编译成补丁格式# r# p0 ^- Y: F# R: T6 z
> sfe a src.asm,TST p,10             ; src.asm编译成补丁格式,输出10H行
$ W7 G/ j; |- M! h& n: A3 F! B> sfe a src.asm,TST p,10,a00000  ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000; o5 Z( b: ^, ~8 l  }2 S
> sfe a s.asm,TST p,10 org.bin     ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
) A/ E$ i' ^/ V) S1 O9 Q6 V/ n+ V  }3 b! l9 P+ ~
*) See Assembler Part to get more 'assembler' function detail
3 K. b# z& @+ S5 u3 i
& Q- x* ^+ N. P; U' w7 a+ U7 w+ @9 a* x' W4 m
反汇编:2 m' u$ f( V- X8 g) b% Q  P! g
=============8 Y$ K- r1 O" K8 H( p0 |; \
> sfe d                                       ; 帮助+ \, j, ]: ]/ z6 D. ]% [$ H
> sfe d src.bin                             ; 反汇编 src.bin0 ^2 G' t  J5 }, ?
> sfe d src.bin,200                       ; 从 0x200 开始反汇编 src.bin! @7 o* V6 {0 q1 q' {3 S
> sfe d src.bin,200,100                 ; 同上, 但只反汇编 0x100 字节
; r" l' k( O0 C$ Q4 J/ j> sfe d src.bin,200,100 a00000      ; 同上,指定了基址,输出时将加上 A00000' @$ u9 d  K: S+ ^4 m5 V' O
> sfe d src.bin,200,101 a00000      ; 同上, 但遇到返回语句将停止" H9 X  }, k7 o( _# G+ n% H- \5 Y
> sfe d src.bin,200,101 a00000,p    ; 同上,输出时不带地址
8 X0 i' u. F3 w+ h: h> sfe d t.txt,27e000,101               ; 反汇编 t.txt补丁文件
. P  `0 K2 t0 t: ], \% v> sfe d image.bmp                  ; 单色图形汇编输出7 u* y7 [0 |* R2 E  G& x; `* X
> sfe d image.bmp,8,8 10,10,img1  ; 同上,从图形中x=8,y=8,w=10,h=10取出。
  K4 J; S: |. n# w/ X9 A! x/ ^* x) I4 C$ F2 [. Z5 O& P
调试:
9 L0 @# q. b: a* ~7 ~# X* X=========
7 C% C! P1 C- O8 F0 Q( y4 _' N> sfe r                          ; 帮助+ e# S% B" G8 m/ _
> sfe r src.bin                 ; 运行 src.bin
; V7 Q' w7 D- s/ O> sfe r src.asm                ; 运行 src.asm 汇编文件
+ {* [. t% i$ {% h/ o> sfe r src.asm ,n            ; 同上, 正常输出
: d5 Z: K: r) @5 X2 A1 {+ ^& b+ D/ x9 S> sfe r src.bin,200           ; 从 0x200 地址开始运行; H- ~  \: X8 H  [; x* R
> sfe r src.bin,200,100     ; 运行 0x100 字节, 运行地址 0x2002 ?2 {7 Y( j9 p6 P  `
> sfe r src.bin b00000      ; 以 B00000 为基址运行' W+ q& u, l, y% p9 L7 C4 q- x1 i5 E
> sfe r src.bin ,,src.mem   ; 加上内存文件 src.mem 一起运行
  b( W  G1 i, Q# K9 j! Z2 N" V> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行: m5 R: \0 |' ~* n
, S3 o( }; x+ H8 V
" K$ T! ^# I6 _- t' J
交互调试:5 A" }; G+ v0 c
======================* C. f5 d  R) t6 `) t
> h              ; 帮助) b& K  n9 `4 G# [
> g a00000   ; 到地址 a000001 i  @# [+ |$ s0 j4 X5 ~
> g 37:3800  ; 到地址 37:3800 (37*0x4000+3800 = DF800)
& }6 X9 b- _( B4 F$ W> d              ; dump 内存 (现在地址)
" [8 q# s$ H! T7 m+ }9 J> d a00000   ; dump a00000 开始的内存0 V0 B$ b. p& ?9 C3 E5 i) ?
> d a00000 200   ; dump a00000 开始的内存, 大小 0x200
7 }5 j; X* R/ U, u2 @0 [> d r            ; dump 注册
1 \- z! e! v- H! M" `/ W> a              ; 单句汇编
9 w; M% S# Y4 w, t; Z# F6 U5 _> a c7d530   ; 单句汇编地址在 c7d530
) O' U4 V  e! F2 l# y! Q: S" m4 R> u              ; 显示反汇编) G0 g+ Y0 x# L2 w. K6 D* B
> u a00020   ; 显示地址 a00020的反汇编
  G9 a6 ^1 L2 y: v+ A( ?# N# G> r               ; 在现在的地址上执行一条语句
2 Z2 }. S+ z6 s! s+ g1 U1 I> r 1            ; 在现在的地址上执行一条语句 (跳过call语句)
  {. k# F$ [1 ?0 N& U> r 0            ; 运行到返回语句
9 G: T5 N* c+ O0 B* d> r -c7d580   ; 运行到地址 c7d5804 U, {$ }! W3 m8 S# a, H3 t1 j3 r
> q              ; 退出8 @6 `. b, ~, H% ]1 i' T

2 C8 G6 g" _# [) m6 c( Y* K! w*) 所有未声明的语句都会改变当前地址。
6 k& J) V$ a8 Q6 Z# |9 o' r4 ?* T; p3 y2 H- s4 H" c% I" ~
7 g0 K3 \) v+ g3 V8 a3 R9 }! H7 X+ R
特别的助记符:
4 _3 C4 |' U* y0 x: ^============================0 M7 y* v1 ^  r4 c* o' t3 K& S& T
*) 所有C166的汇编格式. p  d' w5 j) T. u& F( T7 {- S: Z
*) 分号用于注释 (在一行的任何地方)$ ?& R4 d' x+ L( s0 z' Z7 l' N
*) 特别的助记符如下 :
6 \: X; S3 _/ u6 {8 E) W   #include filename    ; 包含文件(各种定义)5 u0 i! ?% ~" q. A/ {) B, P
   #define var value    ; 设置替代变量 var = value
: Z  c' l& Z. n. U1 \* k$ Z   var equ value        ; 变量取值 var = value& s7 _- v" H6 h8 X( o
   db 'X',36h               ; 定义 byte(s) 数据区
/ {9 p8 j0 Y0 v# q   dw 1234h,0,'AB'      ; 定义 word(s) 数据区
; W3 K( B0 N/ M& M5 X. F0 b! P4 M   org                       ; 设定当前地址8 W% ?3 N3 i- o) H4 M% [
   base                       ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
9 K# {- Z- V2 o3 a% z  n  \   end                       ; 结束记号  _' ^9 f5 s7 l) A
   ;#name XXX.string    ; 定义补丁名称 (XXX). g4 w" e" m, B9 [: V7 y* g
   '                   ; 注释将一起进入补丁+ i3 r/ }& T! l. R  Z
   ''                   ; 注释将一起进入补丁,加回车# y# E) Q" H# ]( j! x% t. v4 k2 `/ u
   ';                      ; 以下内容将全部是注释,直到出现 ''' \/ M$ i5 h  ^. r7 q- v+ L
   ;'                      ; 注释将一起进入补丁
" l; N' X; a/ T   + - * / %            ; 加, 减, 乘, 除, 求模 操作
; m& ?' E' V$ w3 r. ]   >> > < <<         ; 右移左移操作9 I, A+ k( C9 |/ \7 O1 i! _0 V
   & && | || ^ ^^    ; 与, 或, 与非操作
8 W  D5 Z) W" q   val1:val2              ; 页表示地址 (val = val1 * 0x4000 + val2)$ I0 i- q* ~& e- z1 t- H
   page(value),         # J7 u" Y  q/ }2 l' O! v
   pag(value),
3 ~; ^2 U( g) c0 B$ k" ?   p(value)             ; 页值 (= value / 0x4000)
3 Z! F& d  p/ p7 j: e5 f3 W2 Y   pof(value),
9 i0 y8 M" s6 A, e3 i$ m   q(value)             ; 页偏移值 (= value mod 0x4000)
0 r$ G, c/ Y0 {+ m' @# J   segment(value),( g' i4 [/ f0 }% y2 _; Y$ Q
   seg(value),& V+ f( T& {0 j8 d- K
   s(value)             ; 段值 (= value div 0xFFFF)
# C$ O& V' h1 v" n   offset(value),
8 K* ]* a0 n7 v   ofs(value),- Q0 |" h8 v; `, y  P$ ~' Y
   sof(value),
* R8 k, Q5 s2 G   o(value)             ; 段偏移值 (= value mod 0xFFFF)
1 Q! Y$ ]6 X% i! F$ U1 q$ W( }8 o4 [* n  s- w+ h+ _7 O/ G
*) 例子:
( o- x2 _7 H5 u
3 x' f* r$ F) q2 ]7 l; h# j;--- Testing ---3 E9 s' Y. @  M! K

$ A$ b; \: R3 h9 Y% v4 X8 Tbase 0A00000h                ; 自动转换文件地址为 SL45 内存地址+ l; D1 b& O5 I& P. m

6 V' Y' u9 E& d% a& Y& p#ifdef ME45
  W( Z  `; S+ ?9 \! f# H/ ^* Q2 D  #include me45.inc/ c2 s# o, w0 h8 k% q) `
#else2 ^7 k/ F; |. M* p# t9 O
  #include sl45.inc
$ C1 L9 t% d- z: Y  #define  FreeRAM 37h:3600h
& Q9 G4 z/ g; S% @  #define  memcpy  0c7b384h
5 v3 L5 K4 T/ J+ L; R. m' r#endif. P% k3 I' b% b
. F, J6 L# h8 q; j1 u6 ]
;#name TST. Test Patch            ; 补丁名( b, c, u1 J+ ?/ W) b% T$ P

1 W4 h& W) S: U% T3 v* F( d( d3 k'Firmware : sl45v562 _9 I0 v3 ], H
'Author : rizapn, \1 O( j1 J* ]
'Updated : Aug 18, 2004
$ C# t4 q* ]  c) y. v, V% ?
# J7 U1 i! U6 O( C9 j! korg 0c7e000h
* \0 C* M5 v; Y5 e$ V% l    mov   r12, #q(FreeRAM)        ; 得到 FreeRAM 页偏移0 k* D; @+ ?3 b% x5 n
    mov   r13, #p(FreeRAM)        ; 得到 FreeRAM 页值
4 S6 X/ x4 f1 \' N    extp  #p(data2), #1             ; 跳到 data2 页
6 `( y4 B1 ^. p5 O/ |; {2 c7 D    movb  rh4, q(data2)+1          ; 得到 data2+#1h 地址的值(为 10h)
8 I/ S4 p( V3 {6 c+ x2 X7 F& P    callr sub_1                            ; 页内调用" t4 l# l6 j, ~0 k- a
    movb  rl2, #'A'                      ; 得到 ASCII 码 'A'
" u6 \( K3 A6 |- Ploop_1:) m! O( |. @  W, m
    mov   r2, #1234h
$ F- S9 ~! G  Q5 x+ Q8 e3 B9 [. p    mov   [-r0], r2' z0 |9 [1 b6 e7 n; N% W7 Q
    calls memcpy                    ; 调用段表示的子程序8 b4 A9 H# X9 x1 X7 \8 T
    add   r0, #2
" h: o( N* X# C8 b) M    jmpr  cc_NZ, loop_1           ; 跳到 loop_1 标号处% g) v8 t  s( i1 Y
    rets
" p% l- R8 ]+ u: d4 x8 z6 X
$ S4 _+ m+ E7 }9 m+ k- _. Zsub_1:7 r5 i; n/ L1 L5 B
    mov   r4, #1234h0 [/ k& m7 n$ D/ n2 Z
    ret( M; J( Y, v" N+ {% O6 F( E
+ W8 J! n! I" S8 k, N, F
data2:# h! P0 b9 ~* c* z* M6 o8 M% h5 a
    db    'A',10h,'Testing',0     ; 定义 bytes 型数据区. e; K- V2 P9 y
8 p/ y8 q) e6 i
end7 {" ~2 B- P: C0 m# K
0 S# ]  R. ~+ `! \5 K4 Y. B1 _7 g+ H
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
( q9 m& e' K: A! g2 w) j, \4 e1 `
Allaahu Akbar,$ h* u1 I/ o0 G( P
RizaPN <rizapn@yahoo.com>
9 z( ^3 g+ t3 o% c* D& C- w9 {Jakarta - Indonesia
( v8 j! B+ p: Z8 p) y" ^3 v1 |  e1 n: G3 H6 J& H/ ^
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ]
发表于 2005-11-14 23:59:28 | 显示全部楼层
这个要学学了。谢谢楼主。
回复 支持 反对

使用道具 举报

发表于 2006-4-17 23:06:30 | 显示全部楼层
学习中…………
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-5-30 05:55

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表