爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

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

sfe.exe的使用说明

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

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

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

x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:) T7 {' y4 A0 n: F9 }) j# t4 c

# @0 t# \9 R" f. z" Z+ a& n" Z简单帮助:; e, b0 L* |% W9 o8 I3 g
====================
8 n9 E: h6 F# f5 P% e5 ~& Q*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。
2 y* ]7 [: f7 S, g6 J*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
5 b1 x4 l/ W* o1 @! \: ]( S7 e
+ l) B) F( r, H1 H2 k5 d. Y: Q7 d! P: A7 y4 h
搜索空白区:
6 A8 o+ K) w8 z  {=====================
5 R/ @* R, m0 u6 b  m> sfe 0                        ; 帮助
" [  D5 k" m3 i9 E> sfe 0 binfile.bin          ; 搜索空白区 (默认大小 = 0x300 bytes)
9 Y: H. A  z0 a" y: j0 p" \> sfe 0 binfile.bin 1000  ; 搜索 0x1000 大小的空余空间
' N; E7 |. ^, a- @/ @/ p( _/ m0 i2 q* X+ w
二进制拷贝:
# A- K( g! A2 `- I; L============
# u& N" P. d0 K, o4 a> sfe b                                      ; 帮助/ L6 Q; |( h) d$ I
> sfe b src.bin dst.bin                  ; 拷贝 src.bin 到 dst.bin3 n. ?* v, @7 m5 G/ B+ h  v
> sfe b src.bin,20 dst.bin              ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
8 h: L2 K2 z4 @2 t> sfe b src.bin,20,100 dst.bin        ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
' Z: s1 n4 Q+ Q0 L6 u/ }: c' ]> sfe b src.bin,20,100 dst.bin,200  ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
$ a5 Z1 p: D4 m  i! H: ~/ s  F' n3 N. o( Y/ c1 x% y
比较文件:/ F6 }4 L, F. w6 f: Y
==============
, I6 k. @- P+ T8 c# Y  k8 ]> sfe c                                              ; 帮助# }' c+ _1 l4 z# E; I) W- Z7 i
> sfe c src.bin dst.bin                         ; 比较 src.bin 和 dst.bin
0 K1 `" T( _- z+ I2 u* l9 D> sfe c src.bin,20 dst.bin                     ; 比较 src.bin 从偏移 0x20 (与 dst.bin )' o; j; m2 m( I4 [: z8 ~1 ~
> sfe c src.bin,20,100 dst.bin               ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
3 k- g2 j* J+ E, d5 j8 r> sfe c src.bin,20,100 dst.bin,300         ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
1 x: g% `* Q& V" @1 g  d> sfe c src.bin,20 dst.bin a00000          ; 比较结果显示地址加基值 A00000! V7 ^" `/ R, X& [9 T- I0 t
> sfe c src.bin,20 dst.bin a00000,16     ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
! `- R& t4 v* Z4 T0 W> sfe c src.bin,20 dst.bin a00000,16,all  ; 两个文件都显示(不仅是不同处)
: O) _) `+ w" x/ t
1 H. J) _9 z+ z) g发现16进制的地方:
) U9 x3 m! s8 G; S: k7 y====================
; ?% {6 S, m1 B, F) V) n6 b$ `> sfe f                                     ; 帮助8 I/ M5 ~) i; Y0 _
> sfe f src.bin e6,f?,,20,e6          ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个1 n/ B4 G9 l: y: n" g+ T" I0 `* m
> sfe f src.bin,200 e6,f?,,20,e6   ; 同上,从 0x200 开始找6 r" r" G. s! h2 A
> sfe f src.bin e6,f?,,20,e6 10     ; 同上,显示 10 bytes( @+ ?* O' i' \0 @; c9 S1 d
> sfe f src.bin e6,f?,,20,e6 10,4  ; 同上,是反向找
4 x' ]1 S4 z, k8 t+ ~# _: }) }> sfe f src.bin 1234                   ; 显示从1234H开始的内容, 80 bytes 大小
1 K0 |/ K" r9 d# L% S7 x% p5 Z! ^) E> sfe f src.bin 100:1000,8           ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.' Q( u0 N5 s$ D  A% k
1 D9 m+ l. g9 {) U1 D4 m: y
提取语言数据:$ P" m4 f9 T$ ?! T3 x
======================9 s8 j/ ?$ @% v# N+ q' `6 E
> sfe l                                          ; 帮助- E1 J2 p  J. o  V7 }
> sfe l src.bin                                ; 提取第一种语言,包括扩展文本数据3 O0 q2 Y. [4 ]& ^; |3 }
> sfe l src.bin 200                          ; 显示 ID 200 的字符串' P; L1 i/ e$ {
> sfe l src.bin 200 2                       ; 用第三种语言显示字符串* b$ a, F* \8 N, ^) ~6 f, j
> sfe l src.bin -1                             ; 提取第二种语言4 e4 w4 w+ E$ i' F6 \/ {' l9 f* W5 \) ~
> sfe l src.bin -all                            ; 提取所有现存语言% H! ^% ^2 p6 t1 c
> sfe l src.bin 'Testing                    ; 转换 'Testing' 字符串5 F* s2 {6 j6 H& _! {. Y$ Y8 t
> sfe l src.bin 'Testing 1                  ; 转换 'Testing' 字符串( 用 ID 1 语言)# h1 r+ e8 s0 ?- k2 q) [
> sfe l src.bin "+41 8C 91 56 4F"      ; 转换16进制文本- R. q* p) U% P! J" h4 Z/ l4 H
> sfe l scr.bin 200,"<95>Test"         ; 用字串 "<95>Test”更改串号为 200并生成补丁
2 B8 U9 r% Z' \% t, k> sfe l test.lng                   ; 检查test.lng 语言包
* I# S: F" ?" B* L. f> sfe lc test.lng                   ; 检查和更正test.lng 语言包' e9 b3 x, s; i) O2 N" p1 z

, _( _$ Z2 a( H1 o提取菜单:
( F# b) e5 e% A" S8 B0 z=============+ _9 T7 s" j$ v# W7 O
> sfe m             ; 帮助& T  C3 S* h) r
> sfe m src.bin    ; 提取菜单结构和入口/ E7 G: K1 ^4 J% A9 \; b' c8 W4 n

/ v; y* f/ W8 P# r" Y
* R- U4 d  o& ~- W3 Y( C( f补丁:8 S6 B/ P- ~, @  B
=========
2 v$ R0 Q& p7 ?; s6 A' E) M> sfe p                                        ; 帮助7 S" b& e8 C) |5 T. O
> sfe p sl45_44.bin patch.txt 44,BCI   ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
  H2 i- C4 @& D7 a: S2 Q! f5 C+ _> sfe p sl45_44.bin p.txt 44,BCI,u             ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz% k! T2 ?4 B7 P) {
> sfe p binfile.bin p.txt 00,BCI             ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz ; H1 R2 Y) E0 b0 P
- `) d0 ^& C( n8 `
% v: B; F1 L! Y! X6 s6 Y6 o
编译:
8 K. f+ \: C* q; p- M# E$ f==========) Y0 g' F/ r. B8 R7 A
> sfe a                                     ; 帮助
/ J/ e9 I: \) l> sfe a src.asm                          ; 编译 src.asm' @7 ?5 H$ d! p* a3 h+ n: _, L3 `
> sfe a src.asm d                       ; 编译 src.asm, 完整输出
6 d0 ?; J3 A4 R6 X> sfe a "mov r12, #1234h"          ; 单句编译
4 v3 F& T0 F1 Q0 T3 k> sfe a "mov r2,r1 ; sub r2,#1"    ; 多句编译/ t1 `$ x" R+ ^" u4 W
> sfe a src.asm,TST                    ; src.asm编译成补丁格式
' I3 f- q- Q, a' v' L" j, k> sfe a src.asm,TST p                 ; src.asm编译成补丁格式+ I. N/ g1 H( s2 l2 g
> sfe a src.asm,TST p,10             ; src.asm编译成补丁格式,输出10H行0 V& d5 X" t. p0 e3 K
> sfe a src.asm,TST p,10,a00000  ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa000002 T' V! r. M6 x4 @% b$ u
> sfe a s.asm,TST p,10 org.bin     ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。9 F& t( r9 |4 e; i

; r* r  Q' k" `) O' v- u+ A*) See Assembler Part to get more 'assembler' function detail8 K0 S! m9 g4 T3 f/ {' x
& x6 `0 M* t1 s9 x# p

5 g/ j( s$ ^) W" y- r1 {反汇编:+ o8 x: E8 Y/ P1 a0 j
=============
, G6 \0 `0 K! `; ~> sfe d                                       ; 帮助1 ~- f) k3 B9 U# T
> sfe d src.bin                             ; 反汇编 src.bin
  N( M5 t( N- f( c4 T& p> sfe d src.bin,200                       ; 从 0x200 开始反汇编 src.bin$ ~0 O0 e5 b; \4 v, E' `( c! s  x
> sfe d src.bin,200,100                 ; 同上, 但只反汇编 0x100 字节, C4 ^, \5 ?0 v2 F, r- Q; K
> sfe d src.bin,200,100 a00000      ; 同上,指定了基址,输出时将加上 A00000/ m: N- U9 y) G7 ^# d) s, V
> sfe d src.bin,200,101 a00000      ; 同上, 但遇到返回语句将停止
0 A9 J& v/ K  o- z( j  h* Y2 V> sfe d src.bin,200,101 a00000,p    ; 同上,输出时不带地址
8 @: H, {4 p* c0 U- G! k( @! ~9 r5 ?: @> sfe d t.txt,27e000,101               ; 反汇编 t.txt补丁文件* W" n7 w1 n* |3 z8 K. n. t& {3 ?! E
> sfe d image.bmp                  ; 单色图形汇编输出
0 b: ]7 y6 ]5 ?/ \, R> sfe d image.bmp,8,8 10,10,img1  ; 同上,从图形中x=8,y=8,w=10,h=10取出。7 H% k& R! }0 p

- b" \8 ~$ r! x, _2 P调试:
+ G, r# z) ]- ~1 g+ {=========
1 H. I' b" I$ V, c! x) w> sfe r                          ; 帮助
2 [6 A$ H# Y) v7 B% A, e. x% x> sfe r src.bin                 ; 运行 src.bin
# I- d, e9 F, c4 I3 A> sfe r src.asm                ; 运行 src.asm 汇编文件. y& Q1 r5 a( K
> sfe r src.asm ,n            ; 同上, 正常输出! A' K, j0 R8 x
> sfe r src.bin,200           ; 从 0x200 地址开始运行: U% O  H, b- H% y
> sfe r src.bin,200,100     ; 运行 0x100 字节, 运行地址 0x200& f" B/ e! |) u: R5 W$ {. H
> sfe r src.bin b00000      ; 以 B00000 为基址运行
1 F6 p$ o, C) J0 W3 x0 g> sfe r src.bin ,,src.mem   ; 加上内存文件 src.mem 一起运行
4 \- l# @% [% G8 z+ M+ q* @( G# ^/ u> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
: U2 L( s' E+ b7 o3 J6 T' ^5 M# x" a$ k- Q: S8 v* X; u
. R( E! H- c9 K0 }
交互调试:
$ D$ c# _; @2 F3 z" z5 u======================
% L0 b  A/ i( g8 _& f: b> h              ; 帮助
% o7 u" v3 L8 S) N& g> g a00000   ; 到地址 a00000# I. H; `+ m& b0 o$ @( L
> g 37:3800  ; 到地址 37:3800 (37*0x4000+3800 = DF800)5 u# r: u. s9 Y  W- Q8 q( |* c! r* |
> d              ; dump 内存 (现在地址)
. M4 N. B" d7 N0 L5 s3 R> d a00000   ; dump a00000 开始的内存6 O2 P: U- Q) O3 x9 Q( E' \4 Z
> d a00000 200   ; dump a00000 开始的内存, 大小 0x2002 D! q, q' E0 l0 J3 t* U
> d r            ; dump 注册
, x' S' S3 [  t) h> a              ; 单句汇编
2 K; @- w" k7 r5 k" ^3 [( M> a c7d530   ; 单句汇编地址在 c7d530
8 y) H9 O! I! E9 `* e. _8 {> u              ; 显示反汇编
4 t/ a: N; Y- g/ x$ Q* [> u a00020   ; 显示地址 a00020的反汇编
& B, ^1 {9 H) y% ^4 F> r               ; 在现在的地址上执行一条语句
9 I" K3 l- g; a( |! r; w> r 1            ; 在现在的地址上执行一条语句 (跳过call语句)
" v: x3 d5 ^% J8 v# F5 l> r 0            ; 运行到返回语句
1 O' w2 _7 M. x: e1 ^% A; k> r -c7d580   ; 运行到地址 c7d580+ |0 K# T3 S5 e7 |5 s
> q              ; 退出3 ~5 l' E3 O" c5 G: _  c
3 E8 i# @$ n! g, U2 s/ R
*) 所有未声明的语句都会改变当前地址。) D( @3 F2 ?* p+ ^6 M. v

2 ~  B5 j- O5 h
8 r, R8 r) J3 z# x: ^/ p& P特别的助记符:4 I0 f6 ]9 `" X  u' X4 ?
============================
# z/ j; f, Z0 B3 g*) 所有C166的汇编格式4 T7 t: Y, b5 z) {( u/ ^. j* q
*) 分号用于注释 (在一行的任何地方)
) n2 w6 m% w! T& w, u! ~# F*) 特别的助记符如下 :3 B, x7 @4 T: R6 [2 J: }4 D& \
   #include filename    ; 包含文件(各种定义)
! L$ ~, A' d. Q% l" ]   #define var value    ; 设置替代变量 var = value- G* L* Q, G& X+ `. ~! E1 a7 D
   var equ value        ; 变量取值 var = value$ _* H# `! b: Z6 G7 R- E
   db 'X',36h               ; 定义 byte(s) 数据区
7 K: g: Q. K- Z1 ^- n  F* X" {   dw 1234h,0,'AB'      ; 定义 word(s) 数据区
/ F1 r, D7 v# F3 N$ }$ |   org                       ; 设定当前地址
/ a  c( P2 E! G3 y   base                       ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)- M; k( F7 l) E# @' ^
   end                       ; 结束记号8 b( ?  h0 ^0 I
   ;#name XXX.string    ; 定义补丁名称 (XXX)4 V! {) n2 C* B* ^7 `" \* o
   '                   ; 注释将一起进入补丁
! k  v- T/ n0 ?1 x. m; O   ''                   ; 注释将一起进入补丁,加回车" O* \5 n; y) L/ N
   ';                      ; 以下内容将全部是注释,直到出现 ''
$ |' _! q4 x# O$ I. w6 o6 F( ?  R; w' Y   ;'                      ; 注释将一起进入补丁" y5 z1 I, N/ T; y: x) \
   + - * / %            ; 加, 减, 乘, 除, 求模 操作
8 o; T$ M) e2 N: \   >> > < <<         ; 右移左移操作, X+ C0 F: S6 y7 l* p: @" e! k8 W  M
   & && | || ^ ^^    ; 与, 或, 与非操作4 {% u, R; J- v( w. v' {
   val1:val2              ; 页表示地址 (val = val1 * 0x4000 + val2)
% O# {$ _' E7 B8 T: S( ]$ r8 s! O   page(value),         $ D" x! D! r0 f2 G( u2 v
   pag(value),5 d( H  m1 [7 x" i0 z; ^
   p(value)             ; 页值 (= value / 0x4000)* [% Y8 i1 t/ w  v
   pof(value),
7 O* M+ S- k; @9 a   q(value)             ; 页偏移值 (= value mod 0x4000)
6 J$ ^  [" j" E- N   segment(value),
/ u* ^6 V1 I; a* Z" q, ^   seg(value),4 {& J8 A# }0 f) S, p( n
   s(value)             ; 段值 (= value div 0xFFFF)) z2 U/ R; A; h/ Q
   offset(value),
- o: m, L8 ]# r5 v   ofs(value),, A6 `3 O& \% l/ c2 s" a' g' p
   sof(value),# Q) [) X3 X" _% e# G
   o(value)             ; 段偏移值 (= value mod 0xFFFF), Y% [1 ~2 K+ e/ I: m4 [7 i

# ~/ F5 k- x4 Q2 x; j1 x*) 例子:
# T, q  z0 T- `3 y
; L1 q+ m! k* w1 ^;--- Testing ---
- a1 O) M' v" R; v; j1 H: }& a  m; e# s
base 0A00000h                ; 自动转换文件地址为 SL45 内存地址
! D. a2 V/ ~1 g6 X2 E, X! g# z; Q7 k& a0 E0 m  m
#ifdef ME45
& U- f; s$ O! G/ q; B7 Z  #include me45.inc
1 S9 I3 Q6 S: j2 [+ w#else  b0 J* J3 Z6 Z1 S1 b$ M2 Z
  #include sl45.inc
# u$ M% W. S( `2 ?: E  r" c9 Q  #define  FreeRAM 37h:3600h6 a  W8 `7 g. B6 P" ^) Y8 Y9 {+ V/ w
  #define  memcpy  0c7b384h( b1 V% N8 ?2 h) a1 R
#endif
( @2 n- ^2 |8 M& n9 f5 T. S4 S. |8 S- ?+ J7 \
;#name TST. Test Patch            ; 补丁名, q4 W* I+ q- i7 _' j! j8 _
' q! G9 M$ u3 c+ a: P+ f  l: ^4 x
'Firmware : sl45v56) J! F- f9 l3 w
'Author : rizapn
7 h' X! h5 m# f2 \: c9 D! r. x'Updated : Aug 18, 2004
9 N8 T+ E, b$ y5 V# r! _2 ^" Z1 M+ s, c& R/ Z$ s6 K
org 0c7e000h5 v# l  O# ^7 L5 a3 Y
    mov   r12, #q(FreeRAM)        ; 得到 FreeRAM 页偏移
0 h, b. O+ l! ]5 _/ z: G4 G0 B    mov   r13, #p(FreeRAM)        ; 得到 FreeRAM 页值- t$ H, @: ?$ t1 W6 l
    extp  #p(data2), #1             ; 跳到 data2 页* @" Q7 \/ O; D) O
    movb  rh4, q(data2)+1          ; 得到 data2+#1h 地址的值(为 10h)! k7 z: a/ U3 ^+ `
    callr sub_1                            ; 页内调用
/ T4 j6 D6 a- v4 C    movb  rl2, #'A'                      ; 得到 ASCII 码 'A'
# O! `* K2 K( T$ X7 f9 m1 q; yloop_1:( V; {* }2 p: J& T
    mov   r2, #1234h1 g' ?+ L3 [. J) d9 G
    mov   [-r0], r21 h) b  m  e: `4 u+ B. C$ S
    calls memcpy                    ; 调用段表示的子程序
+ ^/ o  u; l' [' {3 C    add   r0, #26 h8 ?  P. c" ?3 h& |
    jmpr  cc_NZ, loop_1           ; 跳到 loop_1 标号处
- x! }5 @. S- e$ r3 g; d* A3 Y    rets& J( O) j: J: W# P

( I6 B$ B4 b$ C9 g6 ysub_1:0 V* B4 \3 ]+ O* ^6 J" a$ ]6 b8 T
    mov   r4, #1234h4 n( k" M  \  W% b+ f1 f
    ret( A# @9 Z2 @$ f7 |9 x
1 a- @. n3 z- x! [( O! Y9 Y  J1 V  l
data2:! i, m& Y3 {  B% C- O; k. o% x
    db    'A',10h,'Testing',0     ; 定义 bytes 型数据区
6 H, J/ e7 ]- g! ^
3 B, j9 V4 j6 c" n  c0 ~: Hend
& n3 r' R% G0 G" u- s& N- K: l, X% e% h
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~5 @2 v! `2 I1 k  ?6 L( N9 ]

5 l9 r, b1 L7 h" H; YAllaahu Akbar,1 w2 O$ A4 Y0 I" n  N% |5 ^& l
RizaPN <rizapn@yahoo.com>
- J. u9 U+ P% V: f6 w2 u0 uJakarta - Indonesia
$ Z9 B- p- }: q! Y& L) t" S3 ]" B/ V$ ?5 r$ ~& M/ {
[ 本帖最后由 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-7-5 19:16

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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