爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

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

sfe.exe的使用说明

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

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

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

x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
- u) [5 K! ^! u  G4 @) S2 x# V- N' E7 M; t
简单帮助:' o  c2 u# O& v- L( i
====================( T8 ~' @6 H2 N( O9 I6 ]/ E
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。* ^) Y3 p7 W* S. v$ v
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
& }( ?/ g' x/ Q; b! a5 l; g3 Y  e" i' p) D, f5 ]  |4 j9 b' C# V* r/ J
: I4 c& b2 ]/ l4 |/ Y& o
搜索空白区:2 Z: p0 `7 v2 j% t2 _( D) s; c4 H4 ^
=====================# j0 m1 s" ^  M* R# F) W. |
> sfe 0                        ; 帮助2 I$ t- O8 f- h' n
> sfe 0 binfile.bin          ; 搜索空白区 (默认大小 = 0x300 bytes)
5 r) W- X; U. ?  j& u  x3 x> sfe 0 binfile.bin 1000  ; 搜索 0x1000 大小的空余空间
: v9 y1 r6 V7 p$ z) |0 S# E, ~
7 W2 `4 }: b* k& _) P7 b* v6 S二进制拷贝:
9 R2 n* C+ n# Q3 w5 g) P& M4 b============- t/ k& _/ @6 ]" g) {0 q
> sfe b                                      ; 帮助0 J0 v1 |# C+ p0 Q% q9 V
> sfe b src.bin dst.bin                  ; 拷贝 src.bin 到 dst.bin+ r+ w2 E' e! ^2 _2 F) [2 \
> sfe b src.bin,20 dst.bin              ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
% ^, _9 X% z, S4 y# _& x( [> sfe b src.bin,20,100 dst.bin        ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
3 }$ y+ M! v4 v) I; E; ?> sfe b src.bin,20,100 dst.bin,200  ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x2009 Y# [8 C1 w: Z/ L

* a8 N- i4 f! p- E/ \# B1 v$ \7 w# s5 q比较文件:
8 i% K# @6 ^' R& Y- ^1 ^- L. E4 g==============
& {. }3 b# v9 O$ y2 ~  e7 a> sfe c                                              ; 帮助
2 F( h/ ]/ I& |" e- t. o0 a% M) D# T% a> sfe c src.bin dst.bin                         ; 比较 src.bin 和 dst.bin. H- ^6 c) Q$ J$ `" ]# t# I$ \4 Z: E
> sfe c src.bin,20 dst.bin                     ; 比较 src.bin 从偏移 0x20 (与 dst.bin )8 ~- n! \3 @! y/ O3 l; B4 g' ^
> sfe c src.bin,20,100 dst.bin               ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
7 P$ M/ c4 u- m6 p: `> sfe c src.bin,20,100 dst.bin,300         ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
+ P3 G5 g6 ~) o1 l. l# I> sfe c src.bin,20 dst.bin a00000          ; 比较结果显示地址加基值 A00000
/ N4 h3 U/ g8 L  E8 e  @' F> sfe c src.bin,20 dst.bin a00000,16     ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
+ {3 ]( d  j( R6 `$ R. l/ \5 J2 F5 ]> sfe c src.bin,20 dst.bin a00000,16,all  ; 两个文件都显示(不仅是不同处)
  ]9 z5 e7 k1 \
$ M6 z5 @/ E! I4 [0 k( }- E8 u7 L; A8 i发现16进制的地方:. g4 D# C3 B4 H2 j0 x$ _+ o
====================
% a$ @0 W; ~2 L7 s' q> sfe f                                     ; 帮助
- e9 h/ x3 p, c, g# I8 {> sfe f src.bin e6,f?,,20,e6          ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
" ^" U, x1 p6 P% k- w> sfe f src.bin,200 e6,f?,,20,e6   ; 同上,从 0x200 开始找9 Y) d9 q1 ]" i: L& F
> sfe f src.bin e6,f?,,20,e6 10     ; 同上,显示 10 bytes  z1 ?5 N( W; M$ H' Q6 {# d9 ], |
> sfe f src.bin e6,f?,,20,e6 10,4  ; 同上,是反向找
2 x8 S& T7 b8 ^" R! B$ j7 x> sfe f src.bin 1234                   ; 显示从1234H开始的内容, 80 bytes 大小
+ C9 _! s4 `" E* C/ t4 u  Z> sfe f src.bin 100:1000,8           ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.
- e. J$ h. ^, i9 D/ ^/ {
! Z' \- U! e, t" X4 {6 r提取语言数据:$ ^1 Z5 o" g' z2 `$ H) R4 M( p; w
======================
" w( O+ \! ]# a8 }0 N7 \) n2 @> sfe l                                          ; 帮助
: i- y- O( n: ~1 O% Q0 z> sfe l src.bin                                ; 提取第一种语言,包括扩展文本数据
( M! b' x; R- T: `1 d> sfe l src.bin 200                          ; 显示 ID 200 的字符串
& N: s  |9 E8 |" p, K> sfe l src.bin 200 2                       ; 用第三种语言显示字符串1 v/ X; i6 B# m0 I( \! p
> sfe l src.bin -1                             ; 提取第二种语言$ d, M5 R3 p, X4 g* I$ I* a/ p6 G
> sfe l src.bin -all                            ; 提取所有现存语言
5 g* E4 d4 T7 r# _> sfe l src.bin 'Testing                    ; 转换 'Testing' 字符串
0 J6 ?. {  H6 f( G+ {; ]7 [1 [> sfe l src.bin 'Testing 1                  ; 转换 'Testing' 字符串( 用 ID 1 语言)
7 E1 Q' T$ k* Q3 H6 j, Y> sfe l src.bin "+41 8C 91 56 4F"      ; 转换16进制文本
2 {) \, s: W. Y# B6 {8 D> sfe l scr.bin 200,"<95>Test"         ; 用字串 "<95>Test”更改串号为 200并生成补丁 8 k% E7 m" ^* t9 @+ ^
> sfe l test.lng                   ; 检查test.lng 语言包0 e: U- Y% o& G8 U& V8 ?5 ^
> sfe lc test.lng                   ; 检查和更正test.lng 语言包3 ^- R3 Y, Y/ X" H8 Y

# N" F! i! B. F1 u: S6 M$ F4 B提取菜单:9 `1 \5 F* P- k
=============/ w& X* e/ r$ h- T( d- m
> sfe m             ; 帮助% Z  V* i7 f: W+ r9 U/ C, ?; I- k
> sfe m src.bin    ; 提取菜单结构和入口1 D9 Q7 \4 S0 Y9 Q" c

8 Z2 r% d+ Q7 \  D; d' s0 c4 m% v! w8 @, }
补丁:( g# `' j$ J" P9 I: j$ }
=========
  W' p) _6 g3 Y3 V+ g: Z> sfe p                                        ; 帮助
5 ?* o, K3 @3 U. b> sfe p sl45_44.bin patch.txt 44,BCI   ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin# X+ _; S% ]& K& F: \5 G9 |5 T
> sfe p sl45_44.bin p.txt 44,BCI,u             ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
; ^$ B3 c% c, g5 o, g. n> sfe p binfile.bin p.txt 00,BCI             ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
# [& y* |2 {# o+ j1 G# N* W, o

2 E4 L& N0 i' S8 n* A( O: W, ]6 M编译:
7 t0 K  H  B7 u( E+ h, g==========
1 \; H( u! V6 Q& [1 T! C0 U> sfe a                                     ; 帮助5 I8 _  K; j; B5 M
> sfe a src.asm                          ; 编译 src.asm
3 B1 m- H0 v3 ~& T( u> sfe a src.asm d                       ; 编译 src.asm, 完整输出
3 [2 [  T8 P0 r/ a' K! _> sfe a "mov r12, #1234h"          ; 单句编译
) X3 _- B3 m- C8 j* Q  h> sfe a "mov r2,r1 ; sub r2,#1"    ; 多句编译
3 I' M3 I- a* U" H  O$ ^# x> sfe a src.asm,TST                    ; src.asm编译成补丁格式) |; E5 C) f8 \( y2 }7 P0 w$ z* v
> sfe a src.asm,TST p                 ; src.asm编译成补丁格式
* c2 K# a" }8 t4 r$ |# c( o/ t# I> sfe a src.asm,TST p,10             ; src.asm编译成补丁格式,输出10H行  _) [' D2 [  ]# |' V
> sfe a src.asm,TST p,10,a00000  ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
) \* J8 W, N. Y3 {> sfe a s.asm,TST p,10 org.bin     ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
7 N4 M5 M& ?* n; o" k# d( l+ R& R$ U( S- ~
*) See Assembler Part to get more 'assembler' function detail
/ t; B4 {4 Y$ i  }/ i- G7 u( U- [# A! Y+ g3 a& J

8 j, E% ]3 m: [7 ?' a- `反汇编:8 Y; O4 q1 t2 }) i* f; f
=============; q5 s7 f" a) Y6 y
> sfe d                                       ; 帮助0 ]1 e, Z8 x; [# Y3 L
> sfe d src.bin                             ; 反汇编 src.bin
; u# e- H. }  j  G! }8 c> sfe d src.bin,200                       ; 从 0x200 开始反汇编 src.bin
2 F4 l2 S$ |* J/ o> sfe d src.bin,200,100                 ; 同上, 但只反汇编 0x100 字节) P) w* y0 l- |& [
> sfe d src.bin,200,100 a00000      ; 同上,指定了基址,输出时将加上 A00000
" n& d% f' O, F' s$ y6 d6 \> sfe d src.bin,200,101 a00000      ; 同上, 但遇到返回语句将停止
  g$ I/ c$ {9 C  T- x> sfe d src.bin,200,101 a00000,p    ; 同上,输出时不带地址" W* u* V9 N! I0 @  o
> sfe d t.txt,27e000,101               ; 反汇编 t.txt补丁文件
1 M+ ~) I( G6 d/ |; K, ?  V> sfe d image.bmp                  ; 单色图形汇编输出0 M) C: p' K' V" V: t
> sfe d image.bmp,8,8 10,10,img1  ; 同上,从图形中x=8,y=8,w=10,h=10取出。
+ K. Q. n7 \) ]
5 l5 {( I! @0 ~' ]调试:
: X  k: R. S" s. n' ]=========
( y2 }0 B( o* j# B. Z! a> sfe r                          ; 帮助
" Q* q% H( J+ ~1 `$ b! t> sfe r src.bin                 ; 运行 src.bin
' x5 _$ U* j$ W2 D> sfe r src.asm                ; 运行 src.asm 汇编文件3 @0 o# T" @9 Y1 t8 j
> sfe r src.asm ,n            ; 同上, 正常输出: X0 }8 {) s: i% Y. X) Q
> sfe r src.bin,200           ; 从 0x200 地址开始运行
$ s  X( T; R( ?' h9 X. Z% [# u> sfe r src.bin,200,100     ; 运行 0x100 字节, 运行地址 0x200
4 N; b. N( n% b5 A2 r6 d> sfe r src.bin b00000      ; 以 B00000 为基址运行3 H, ^% q* O; e# O; h" W! [
> sfe r src.bin ,,src.mem   ; 加上内存文件 src.mem 一起运行  w, ]: R2 a  ^2 s( X
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
+ p6 |: u8 w& g+ {5 R! W, Y, Y
9 W6 j  G& o0 v0 o4 F! c: k$ {
# ^. i! Z5 q8 c1 S* _交互调试:8 ^5 [4 }; q9 r% I7 ?. Z
======================' R' M2 U& a, T: V. W4 z: V& Y: b6 S0 S
> h              ; 帮助$ V4 a- E' S) ~! u( I
> g a00000   ; 到地址 a00000* V2 l2 ^, q+ M5 x3 l2 ]
> g 37:3800  ; 到地址 37:3800 (37*0x4000+3800 = DF800)/ c5 M% M! a8 `& A5 i2 C
> d              ; dump 内存 (现在地址): A# L) g9 Y" W# U, A$ w5 V0 Y" A
> d a00000   ; dump a00000 开始的内存
( P1 V3 h3 _, i( q# S. ~> d a00000 200   ; dump a00000 开始的内存, 大小 0x200
) D" F2 ?( X" f# D' \> d r            ; dump 注册; j$ u' ?5 j1 G, n: P* P
> a              ; 单句汇编  @! {- N3 S. \1 ?. ^" `
> a c7d530   ; 单句汇编地址在 c7d530
" Y1 f0 |! m% \0 Z' i> u              ; 显示反汇编1 w* n5 E- i7 @- I( b" S7 {! Q
> u a00020   ; 显示地址 a00020的反汇编
8 M2 Q3 K2 h* U* a8 {> r               ; 在现在的地址上执行一条语句
( ^  L3 k6 {7 h2 d> r 1            ; 在现在的地址上执行一条语句 (跳过call语句)
) e: A$ v+ \3 o5 u( c) v, x* z> r 0            ; 运行到返回语句
# L4 c! I. I  O, j; z' _6 z* X> r -c7d580   ; 运行到地址 c7d580
) E/ A+ V% t9 J2 Q> q              ; 退出1 H1 {1 G: d8 v3 C, ?. ?
' e# r$ q& r. m! }0 C( {
*) 所有未声明的语句都会改变当前地址。
; V0 ]) Z( T! M: y1 |
$ H  i$ _* c0 G4 v( H* |, ], _$ ~- b0 b% f3 c2 E! g- M
特别的助记符:, I  y' _9 _' E+ G$ X
============================
& b* `/ D: s* x" x5 w7 t*) 所有C166的汇编格式  O; E4 b5 }2 I: {3 M7 h0 G
*) 分号用于注释 (在一行的任何地方)
1 |# a* o' j# A) `) E*) 特别的助记符如下 :
' \7 [) I" z2 [5 H5 N0 W  j3 y  @   #include filename    ; 包含文件(各种定义)
$ Z: F1 u5 t8 q  f* `   #define var value    ; 设置替代变量 var = value
# c; i, J, ~" B3 G7 o   var equ value        ; 变量取值 var = value# @( ^9 s$ ]. x- n, E
   db 'X',36h               ; 定义 byte(s) 数据区
0 |. T* s" I- I& u   dw 1234h,0,'AB'      ; 定义 word(s) 数据区
% ]7 x$ D1 D8 Z" |. V   org                       ; 设定当前地址! [! Y7 S& B* f' q( t3 ^  F
   base                       ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
+ O, v1 p- T1 L' A. C) [$ V   end                       ; 结束记号
2 j9 V4 N* N! B1 |9 Z: L* v   ;#name XXX.string    ; 定义补丁名称 (XXX)
& ~# w& x6 T- a" W; f" D- W   '                   ; 注释将一起进入补丁
% V, }3 ?5 j: [; ~4 [4 X7 P& g9 Q3 T   ''                   ; 注释将一起进入补丁,加回车
) J4 Q$ R6 c- v% @+ }   ';                      ; 以下内容将全部是注释,直到出现 ''
" M: |7 J1 [3 x5 z4 P" K   ;'                      ; 注释将一起进入补丁
! B9 c1 j7 B& W   + - * / %            ; 加, 减, 乘, 除, 求模 操作/ ]; n  E# ~( r$ z
   >> > < <<         ; 右移左移操作
0 ?# g7 L5 s" ^2 b" l% K8 J% a- N" T   & && | || ^ ^^    ; 与, 或, 与非操作  C1 M$ E6 n! V4 m" g# E  g
   val1:val2              ; 页表示地址 (val = val1 * 0x4000 + val2)) ]8 ]# e. Y. i' }: f- z) q
   page(value),         0 R' B6 w# s  p
   pag(value),
$ }% M6 g1 r3 q1 i$ G% v   p(value)             ; 页值 (= value / 0x4000)9 G2 j9 F4 K. M4 I6 x- v9 U
   pof(value),
% ]' `; S3 R/ k* X3 P7 s) t' c   q(value)             ; 页偏移值 (= value mod 0x4000)/ j2 v6 y" b+ ?) F/ M8 E- z1 ~. x( }( ]$ L
   segment(value),/ i- h/ }3 y6 Q6 C) `5 K% y1 y8 A- T
   seg(value)," ]: Y/ z- B# T2 B
   s(value)             ; 段值 (= value div 0xFFFF)
, x+ n* {# ]) ^4 ~/ _3 P# Y  Z   offset(value),  {& d. D* t/ X: H( y/ K3 i' B
   ofs(value),
- Y2 |- S3 W9 S6 J0 r! c( X   sof(value),# J2 \3 q8 v  U: Q/ u" B
   o(value)             ; 段偏移值 (= value mod 0xFFFF)
, [2 K6 r$ Q" u( C' Y  G2 s. p2 ]3 P
*) 例子:
# r# R$ Z7 y+ U9 P+ h
5 O9 h9 C3 ]* B6 ~;--- Testing ---) C9 B  p; J: A5 j- t& k
& z; v% Z0 t$ F: W$ c
base 0A00000h                ; 自动转换文件地址为 SL45 内存地址
7 @  S" f' O3 w+ i8 m: K6 r
% E* ^: \  T) t; e5 n* \#ifdef ME45, }% e+ w6 d5 V# L
  #include me45.inc+ @) T0 m6 \8 G
#else! a4 e* d/ C7 u! }, S3 ?  V
  #include sl45.inc
- }2 `+ u8 @2 ?: ~  ^  #define  FreeRAM 37h:3600h
# X$ _, }: i' F+ P$ h( w  #define  memcpy  0c7b384h* }( w5 ?& U% Q1 h6 x
#endif! |0 G% v3 z$ J- V, M  J* P3 `
/ u4 y, t: t- v! ~
;#name TST. Test Patch            ; 补丁名
9 W, z6 m/ h; R  j4 m6 Y6 g  M& B+ o- n" n
'Firmware : sl45v56# h+ S7 D" |1 U* ?
'Author : rizapn2 B  z" G# b# U9 G
'Updated : Aug 18, 2004
; f" F5 u' U4 x# f( j
9 [) e$ n3 M! d$ z5 D0 r: i" }: yorg 0c7e000h
8 i9 _1 i' Y! }  A, G* e: W    mov   r12, #q(FreeRAM)        ; 得到 FreeRAM 页偏移2 g, h8 i  p4 \  G7 j- ^; v* C
    mov   r13, #p(FreeRAM)        ; 得到 FreeRAM 页值1 z& u1 U6 m5 R+ z. X; g
    extp  #p(data2), #1             ; 跳到 data2 页
. |0 }) T) P: ~( W" f    movb  rh4, q(data2)+1          ; 得到 data2+#1h 地址的值(为 10h)& c. o! M& L) r! \! f2 p# L, s
    callr sub_1                            ; 页内调用
: N( O: g, K% p% z' v    movb  rl2, #'A'                      ; 得到 ASCII 码 'A'
: k" v9 {8 T; {loop_1:
6 {* L3 e2 s; p: W6 _    mov   r2, #1234h
: K$ H) ~! ?( Y  {1 N# y/ P3 V4 u    mov   [-r0], r24 A: U8 |* u0 t) g4 S7 y
    calls memcpy                    ; 调用段表示的子程序& `  x" {8 K. Y8 M: w* `/ B; m7 ~
    add   r0, #2
4 z; d* n/ ~7 T  ~    jmpr  cc_NZ, loop_1           ; 跳到 loop_1 标号处
# ]# v7 c6 r) E$ S    rets
+ o4 Y* h/ g- S4 J6 x0 z3 q$ P, y# \0 E+ Q% O
sub_1:, f9 g) X; }+ V+ Q5 E! H7 m1 t5 X
    mov   r4, #1234h4 O  b3 K- T& y9 m6 y7 Q8 p- T
    ret
4 P6 M' |- i4 S4 ?* Q3 _0 `/ i0 O# K$ o0 M
data2:/ R* W+ R7 i3 ^! l
    db    'A',10h,'Testing',0     ; 定义 bytes 型数据区; P+ X" m3 N( d5 L

0 r: j8 n8 J1 G: j5 wend
( E' z2 h' p; _! ]1 k! Q8 S; j/ X' Y& a+ v
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- d2 l; d0 k- l% m5 P3 @: g4 _& y) `2 }7 Q7 @) g7 u
Allaahu Akbar,! B9 u  k; @' b) ~6 x3 ]
RizaPN <rizapn@yahoo.com>& @& B! K6 N, l- K3 c- _, }
Jakarta - Indonesia
' c, s0 e' O5 |! }6 v
9 q' }# o) W9 |2 A  Q( m$ O[ 本帖最后由 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 09:42

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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