爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

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

sfe.exe的使用说明

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

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

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

x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
/ F9 e, j- D( w2 m' s
0 a( {  [% _; t8 L7 s' Y3 b3 R: g简单帮助:, E! F: v6 c, D, z
====================
0 _) }0 A8 x* G) H7 o+ k* X*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。, F* X" L" D9 U: K8 }+ W
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.. T3 W3 \; h! @/ H( n2 g* i, g& h

! w) F: p. [: R* m+ F" Z* O7 ?
& y+ m! `2 J9 q2 Q' ~+ Z搜索空白区:+ N& Z9 I; S& \& _
=====================
$ T5 T; I7 U7 x* H* ]- W0 X> sfe 0                        ; 帮助, ^/ d8 Q6 _! B- R+ s
> sfe 0 binfile.bin          ; 搜索空白区 (默认大小 = 0x300 bytes)
8 H- T% |7 V. H) r4 Y, F* b> sfe 0 binfile.bin 1000  ; 搜索 0x1000 大小的空余空间# @* W/ d6 [' r( d( M, m2 I# M
7 F4 G1 U2 l- k4 W, p' m8 S
二进制拷贝:% q4 V" W1 o& O: V) ]
============8 Q6 G! P" A/ F1 }: Y3 x; U- q
> sfe b                                      ; 帮助) L8 o6 l  b  k  k
> sfe b src.bin dst.bin                  ; 拷贝 src.bin 到 dst.bin, t* {( ]( z1 g9 }* t
> sfe b src.bin,20 dst.bin              ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
" A, G: w4 x0 ^8 q4 |- Q7 w+ E> sfe b src.bin,20,100 dst.bin        ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin9 [2 `6 Z7 I  ?/ `, l! O. y) o% ]+ ~) U
> sfe b src.bin,20,100 dst.bin,200  ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
! v) d6 N  @0 P! E
8 q3 s) L6 T. ?比较文件:- ?1 o! O! N/ j; Y5 @. k
==============6 r1 h% y3 C# k, t
> sfe c                                              ; 帮助, |; b$ d1 c: G0 W3 z' ^6 ^
> sfe c src.bin dst.bin                         ; 比较 src.bin 和 dst.bin0 {6 E. H0 }+ b4 o' G- ^+ c& H
> sfe c src.bin,20 dst.bin                     ; 比较 src.bin 从偏移 0x20 (与 dst.bin ): s! q6 D! J& `5 Z9 }7 j' C
> sfe c src.bin,20,100 dst.bin               ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
) h; G! ]" y" h* `3 h  j> sfe c src.bin,20,100 dst.bin,300         ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )+ b, \! T' I/ O- ^
> sfe c src.bin,20 dst.bin a00000          ; 比较结果显示地址加基值 A00000
; Q9 ~& V7 W: w6 Z+ G> sfe c src.bin,20 dst.bin a00000,16     ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
& r( C# e4 G2 u: g+ ?2 R9 n# I  t> sfe c src.bin,20 dst.bin a00000,16,all  ; 两个文件都显示(不仅是不同处)
6 w0 T+ R2 I! E/ B  B5 V2 B# e- ~0 N% ]! f/ u( b$ C. c
发现16进制的地方:- J4 l. f1 u3 K& A
====================
5 @# Z" V$ ^: f2 V2 ^2 u# C> sfe f                                     ; 帮助
, o% d; O" m; x3 g> sfe f src.bin e6,f?,,20,e6          ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个* t  y2 |" ~2 {( G) W% j8 w+ O
> sfe f src.bin,200 e6,f?,,20,e6   ; 同上,从 0x200 开始找
" f% x( E/ r( y6 |> sfe f src.bin e6,f?,,20,e6 10     ; 同上,显示 10 bytes" w2 h% G( Q6 p. _
> sfe f src.bin e6,f?,,20,e6 10,4  ; 同上,是反向找5 _- m2 O5 J0 L. _! @  x
> sfe f src.bin 1234                   ; 显示从1234H开始的内容, 80 bytes 大小
: W2 N0 Q/ [1 n, `> sfe f src.bin 100:1000,8           ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.# t) ~: i- }$ e' O/ K* G( q
3 i8 E2 ^3 }$ D. V- V) b0 [, @' n
提取语言数据:% c1 O" W. ^) [
======================
6 Z4 a% J) f& A2 f> sfe l                                          ; 帮助
& M/ F1 `+ h% q  F- y> sfe l src.bin                                ; 提取第一种语言,包括扩展文本数据; K6 K. G0 D. j% j7 l4 T
> sfe l src.bin 200                          ; 显示 ID 200 的字符串8 {0 [0 g8 x7 e$ Y6 j- I
> sfe l src.bin 200 2                       ; 用第三种语言显示字符串, r( L4 m6 z' b' S
> sfe l src.bin -1                             ; 提取第二种语言
" e& I, |1 B. w> sfe l src.bin -all                            ; 提取所有现存语言
) ~( s% {6 l+ P% {& ]> sfe l src.bin 'Testing                    ; 转换 'Testing' 字符串
9 d# t0 }0 }: E! A> sfe l src.bin 'Testing 1                  ; 转换 'Testing' 字符串( 用 ID 1 语言)
4 v( ~$ \) t9 g& [: v> sfe l src.bin "+41 8C 91 56 4F"      ; 转换16进制文本
3 d3 o7 N( c# v6 m. R> sfe l scr.bin 200,"<95>Test"         ; 用字串 "<95>Test”更改串号为 200并生成补丁 " z; y( B5 R3 {. c  G- }4 \1 {
> sfe l test.lng                   ; 检查test.lng 语言包
1 y: O" b! K5 r6 V> sfe lc test.lng                   ; 检查和更正test.lng 语言包" M1 D" h: P) Q0 L* x

* @5 [7 w9 m2 T5 |8 f2 j提取菜单:9 o2 r) w  b7 g0 c. v# a
=============
: ?% Q, E7 T- _> sfe m             ; 帮助
3 L/ r: w" E% C1 Y> sfe m src.bin    ; 提取菜单结构和入口
( f. a5 Z' e4 r3 |. x9 l' \+ j
! o% m- l! e3 l7 E: N' d- s! e8 W* t; @. M! l6 S4 X
补丁:5 s0 h6 Q! S2 w9 d4 P2 P2 q
=========
1 y1 r" t1 x7 [> sfe p                                        ; 帮助, |0 M# I% ]+ G- F+ D* }
> sfe p sl45_44.bin patch.txt 44,BCI   ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
+ L" o; |* S+ Y, `> sfe p sl45_44.bin p.txt 44,BCI,u             ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
6 e) h" [+ ]* T8 K: y> sfe p binfile.bin p.txt 00,BCI             ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz ' G3 D3 f& A& |. M2 Z
9 f9 A0 ?: a  c+ A# M6 F( h

# O% h. F. ?( r编译:
- S+ _; I# Q- B6 i" ~- g==========' B5 R- }6 v, ?- B3 a, A3 N+ f
> sfe a                                     ; 帮助
% r; T3 ~- ~: e3 N% i; S> sfe a src.asm                          ; 编译 src.asm
& q! q3 ?: {  w( I3 }+ y> sfe a src.asm d                       ; 编译 src.asm, 完整输出
/ P5 m. \& \( v# [) ^6 l! A> sfe a "mov r12, #1234h"          ; 单句编译
5 L) W" ^! o0 P; Q9 \> sfe a "mov r2,r1 ; sub r2,#1"    ; 多句编译
( X- U. L! Q3 }* n' l7 _! G3 ^* ~> sfe a src.asm,TST                    ; src.asm编译成补丁格式8 q, |3 t  ]" U& a. `( }/ R/ C8 m
> sfe a src.asm,TST p                 ; src.asm编译成补丁格式/ ?+ b0 v- Z9 s! M) I% d" {8 ^
> sfe a src.asm,TST p,10             ; src.asm编译成补丁格式,输出10H行
3 I" v9 o; c' l& M  d3 ^> sfe a src.asm,TST p,10,a00000  ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
+ x9 a' Y0 T  M- g> sfe a s.asm,TST p,10 org.bin     ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。* o# v( h  p6 s  k
. w3 z' M# m6 p/ ^2 \$ f" b- t( x$ {
*) See Assembler Part to get more 'assembler' function detail, c+ X5 @/ j( i

8 K- H. S1 o8 B( a! a( h; ?. t1 {
反汇编:0 u! I! |( _1 `5 w0 ?! K  A2 p
=============
# x0 S1 ]* |0 Q> sfe d                                       ; 帮助; e* U9 F, ]: [
> sfe d src.bin                             ; 反汇编 src.bin
; S+ G5 R1 ~$ z" j' e) z> sfe d src.bin,200                       ; 从 0x200 开始反汇编 src.bin3 `& @% {7 X4 {5 `6 ~
> sfe d src.bin,200,100                 ; 同上, 但只反汇编 0x100 字节% b  Y  `- d: \4 l
> sfe d src.bin,200,100 a00000      ; 同上,指定了基址,输出时将加上 A00000; J! u; \; A, `$ o
> sfe d src.bin,200,101 a00000      ; 同上, 但遇到返回语句将停止
3 Y2 M5 X( J3 `! N" J6 m1 d> sfe d src.bin,200,101 a00000,p    ; 同上,输出时不带地址
9 z& v* b  I# h. T4 t> sfe d t.txt,27e000,101               ; 反汇编 t.txt补丁文件
' A: X+ O& n4 H+ A+ @8 t: a> sfe d image.bmp                  ; 单色图形汇编输出
  ^$ ]4 B9 l2 C0 j, g8 j9 r> sfe d image.bmp,8,8 10,10,img1  ; 同上,从图形中x=8,y=8,w=10,h=10取出。& \( t" P- J8 U0 H* K/ ^  U+ O! Z
$ }5 {& Q6 h) D$ h0 X- h/ C
调试:9 S5 M( b9 [) c  o8 N* `
=========  Y7 _+ v# r" q* X' H0 O$ x
> sfe r                          ; 帮助1 U0 {$ F/ C- G! j3 k5 e+ a& {
> sfe r src.bin                 ; 运行 src.bin
! \2 a" s% V8 |1 e/ f% s> sfe r src.asm                ; 运行 src.asm 汇编文件  U$ m) w: K: A
> sfe r src.asm ,n            ; 同上, 正常输出# f) {. U0 z4 @' F' I1 i
> sfe r src.bin,200           ; 从 0x200 地址开始运行7 n5 o3 I: i; M  D( m, c) u  a: C" Q- d
> sfe r src.bin,200,100     ; 运行 0x100 字节, 运行地址 0x2007 ^- ]4 Q' a( D" J$ \
> sfe r src.bin b00000      ; 以 B00000 为基址运行
2 A; j) a# X% G3 F> sfe r src.bin ,,src.mem   ; 加上内存文件 src.mem 一起运行
7 H1 a+ r) ?- X) D2 Y/ T> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
5 j3 Q1 t1 O6 q* l; f0 w& x
8 v6 I' A+ n: N+ c, d5 b  v& c  m- ~3 X3 I
交互调试:
/ K1 G8 w) e* b  d( H' ^4 i======================: y, ?% v: _6 Y: \
> h              ; 帮助+ H- d+ T, {% `. V' N+ y
> g a00000   ; 到地址 a00000
  v+ w4 V, e+ t3 U) F! F3 P3 a> g 37:3800  ; 到地址 37:3800 (37*0x4000+3800 = DF800)
# u7 t% H- ?: }! Y8 @> d              ; dump 内存 (现在地址)
+ L, |$ h, |4 L# b7 }* J3 W% z2 X> d a00000   ; dump a00000 开始的内存
6 L8 F1 m9 u& ?; P! ^> d a00000 200   ; dump a00000 开始的内存, 大小 0x2004 _4 s7 P, Q  V0 R3 y0 G' X) Q1 I6 g
> d r            ; dump 注册
' Y8 j' z0 `" n# b: I8 A/ P> a              ; 单句汇编' U, q" x; c$ |2 k
> a c7d530   ; 单句汇编地址在 c7d530
( j7 t6 k, \% o) P0 ]> u              ; 显示反汇编6 E/ u4 P# r5 K! A6 d' Z, B& L
> u a00020   ; 显示地址 a00020的反汇编. B' |2 D6 r% h1 N* D' N2 a
> r               ; 在现在的地址上执行一条语句, S4 a0 P/ ~* N: Y3 p
> r 1            ; 在现在的地址上执行一条语句 (跳过call语句)
  L* ]9 B/ x! M* B( q' v> r 0            ; 运行到返回语句
5 P% x+ J* s1 Q1 f> r -c7d580   ; 运行到地址 c7d580
6 X# e' {" X, F2 D9 z> q              ; 退出
1 I; V/ G/ v6 g8 X* L" m5 F  O4 A3 n* Q! n6 @+ U
*) 所有未声明的语句都会改变当前地址。
; F. F; f2 f6 }; `, X7 L2 t& o3 V: u8 q% \- J0 z$ F
% h( f. V8 j) J9 L0 c- _" C
特别的助记符:* k2 b2 Q, J3 X& c/ T# w5 E
============================$ n5 Q0 V- A: S
*) 所有C166的汇编格式
+ Z; z; |, J) f6 C* m0 |* L* _( v*) 分号用于注释 (在一行的任何地方). f# i7 Q* n+ T
*) 特别的助记符如下 :
0 e  F; D4 l: ?& r* y) I! u, M, P   #include filename    ; 包含文件(各种定义)8 y! ~, H- h6 V1 i  u# S+ @
   #define var value    ; 设置替代变量 var = value& E( A# z  b" f3 f8 Q+ k' o
   var equ value        ; 变量取值 var = value
, t8 N5 |/ X/ s1 _# v   db 'X',36h               ; 定义 byte(s) 数据区
0 t$ P) Z7 G1 M0 W# V! g: f   dw 1234h,0,'AB'      ; 定义 word(s) 数据区
5 P! W8 `3 b* L% d7 W6 C% q   org                       ; 设定当前地址
( b5 h# r, n& F1 n2 Y   base                       ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
& b- @# A( f: u, V7 z   end                       ; 结束记号7 J- x% A2 @8 `. s
   ;#name XXX.string    ; 定义补丁名称 (XXX)6 Z) t  Q7 E5 o; l1 j8 G4 h
   '                   ; 注释将一起进入补丁; l1 N5 E7 g* g9 L: n3 v
   ''                   ; 注释将一起进入补丁,加回车7 f  T7 k! {# B7 i) T3 a
   ';                      ; 以下内容将全部是注释,直到出现 ''. s0 q' z7 S" ^7 X( }% Y1 z
   ;'                      ; 注释将一起进入补丁. u2 U( ]$ j) r* J& t* l# J
   + - * / %            ; 加, 减, 乘, 除, 求模 操作
$ w2 b* p: |& Z! \/ f   >> > < <<         ; 右移左移操作
" m; q. [$ ~0 O2 R: W3 ?- F4 }# o3 A   & && | || ^ ^^    ; 与, 或, 与非操作0 _  \2 T! G0 M# t2 f
   val1:val2              ; 页表示地址 (val = val1 * 0x4000 + val2)0 m. E' k# F- ^- D0 Y! _8 _3 H4 N
   page(value),         3 s0 ~$ H* Z# F! \; S4 I; U7 B: E
   pag(value),
+ T5 D( t% i# ]. D* a   p(value)             ; 页值 (= value / 0x4000)5 x" J$ _6 t0 F; e6 \/ }$ ~
   pof(value),
4 f, ?6 Z0 W$ b9 q7 q   q(value)             ; 页偏移值 (= value mod 0x4000); A8 A9 c- R- O8 g; Z, O
   segment(value)," n! U* N8 @& J  Q) n
   seg(value),1 S' S: H% N1 K7 R$ g
   s(value)             ; 段值 (= value div 0xFFFF)3 M: H7 i$ C: L
   offset(value),6 \/ R7 D/ c/ _$ ]- R
   ofs(value),4 B- Y3 [9 H5 F! z6 x: e
   sof(value),: e1 f- s: ?: J& U( b+ H0 O
   o(value)             ; 段偏移值 (= value mod 0xFFFF)
( P, {$ ^- `( n( T
1 p! z% T) v1 ?  T' E& P' t3 P. W*) 例子:
4 ^' i3 u7 g% Y. h6 G2 ~/ V  l6 C6 e  F& X$ Z6 l
;--- Testing ---
- b% `6 _+ K, y. q5 t& _5 R! ^) }6 t  K& ^- y0 P" H* P/ P
base 0A00000h                ; 自动转换文件地址为 SL45 内存地址
  m" m  m8 g. L, c/ D* O5 X! m/ o# Q8 ], k* P" v3 D
#ifdef ME45
8 [' S  x/ R* I$ B5 U% m  #include me45.inc2 v, W! A4 `8 d
#else
( k9 y9 {& O; U6 J  #include sl45.inc
$ d# I  G! Q( ^  f$ J& C8 v2 n  #define  FreeRAM 37h:3600h
: b  C2 a7 [; n$ `! r" O  #define  memcpy  0c7b384h/ W& t7 \( ^" |" K
#endif
% a! V* y5 g( {* D- g. A/ `- j) `8 r* @& W3 y
;#name TST. Test Patch            ; 补丁名( _3 J, {/ U: w5 H

* Q. U7 e7 x1 U'Firmware : sl45v561 Z+ W% ]* l* M1 r$ b
'Author : rizapn
# k# j- F  V3 C% G$ ^7 M# ]'Updated : Aug 18, 2004+ C* Y; N* F( o

9 b1 [1 U- [! }0 c0 N1 }org 0c7e000h: ~4 ]; S) a( Q% F; f) V& Z# F
    mov   r12, #q(FreeRAM)        ; 得到 FreeRAM 页偏移, Q# j6 r& d0 f+ q
    mov   r13, #p(FreeRAM)        ; 得到 FreeRAM 页值
$ c  ~5 @; k$ A, ?% R8 q    extp  #p(data2), #1             ; 跳到 data2 页
. o3 J1 K) e8 _+ F, U    movb  rh4, q(data2)+1          ; 得到 data2+#1h 地址的值(为 10h)
6 N  S5 c" d1 |' Z9 c1 c    callr sub_1                            ; 页内调用
9 j- F1 }. ?1 {2 U1 |    movb  rl2, #'A'                      ; 得到 ASCII 码 'A'# V* E3 U. [. U
loop_1:
1 b- n; o# Q$ [+ V7 @    mov   r2, #1234h
* P$ x) C" Q; f$ c    mov   [-r0], r28 K5 t5 L/ x' k) Z* `; y3 z
    calls memcpy                    ; 调用段表示的子程序1 j; B( ]5 H4 ]+ P
    add   r0, #2: i/ [+ ~  v  U: T2 G2 d" u% f
    jmpr  cc_NZ, loop_1           ; 跳到 loop_1 标号处5 }& B: G) I# F; G' ~. p
    rets
$ j' O/ Y3 U2 y& [# x  F: o) `
1 q: j5 x& X0 X- A/ ]) W; h. V/ Rsub_1:! }, R" Y" g: X; f# W- C* {
    mov   r4, #1234h# P- c- E1 l: }! y9 e9 X& T9 c0 l
    ret
+ I5 Q* W* v6 u, Z" `" |1 i0 q2 ~# d3 F
data2:' D/ U1 {5 ?. w" p; a6 w
    db    'A',10h,'Testing',0     ; 定义 bytes 型数据区
$ y7 d; ~* W& {. e! g# r
" r$ L/ s! m3 L1 ^8 }9 }. Bend) D5 o1 o+ m# H& R
7 }" Q, T% S' |: ~
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
" h/ }% i& y' i! z8 P  t+ {
" d+ X  y4 }6 s% HAllaahu Akbar,( c! O" V: T7 P0 i& y; Q
RizaPN <rizapn@yahoo.com>
* U3 n$ i+ q, a; S$ P' j- DJakarta - Indonesia- h9 R! Q) q, H4 B9 Z9 E6 C

, y& d: j4 Q; f* z0 w& u[ 本帖最后由 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-10-22 18:12

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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