爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

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

sfe.exe的使用说明

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

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

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

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 编辑 ]
发表于 2005-11-14 23:59:28 | 显示全部楼层
这个要学学了。谢谢楼主。
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-19 20:29

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

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