- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
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 编辑 ] |
|