- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:# w. \6 a4 O2 g/ b3 p; n# c3 R, W
2 p/ o* B3 q) {5 G) |2 z简单帮助:5 z# r" t0 y% |8 P5 e. q$ [( X
====================
) Y- p! P( A- ~4 G7 d+ _' ~1 c*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。: z2 y j* R* [$ q D H
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.5 l9 U5 a: E) B v6 J$ q; u" p0 S
7 _- H# }0 Z. `( j* c: i
! h. @2 C" o" d搜索空白区:
* y4 t; n( m/ ^5 W=====================3 W6 p5 Z) G8 K T3 p2 z9 d6 m' b
> sfe 0 ; 帮助
# `. N7 c4 I3 u; `3 @" D1 H; Q8 Y2 U> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
! S0 _" W% K7 k7 [( w8 \. N, k> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
3 F: u' H: \1 e5 u- m# x8 I7 E2 p2 p3 f- j
二进制拷贝:5 V: ~( e! ]+ q4 S
============
7 x1 @" ^& v! T$ a- N! \, m> sfe b ; 帮助& w: f! f {, v. { _ f
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
- b* Y- x" v' S. f1 _8 i$ q- @' L& Y> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
& V- j) R* l E5 L, ]7 T$ s* `> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
) Z9 X( n9 M1 C) z, G, V E> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200
/ Z0 \( p% t/ f H+ X/ n8 x0 m( i
比较文件:7 i, D* l0 [0 z4 V5 n( S( h
==============6 e+ P9 q3 ~% u1 q9 N
> sfe c ; 帮助( D: ^) P4 M8 L# n! W Y5 ^0 o. F& g
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
) D8 o# M* x" x4 [7 @, \> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )3 B0 B. Q8 f/ ]# D, @
> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes4 u/ {" v ~" b s. P8 _/ r. q$ U& T
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
) z" a" o7 x+ }$ ^1 |- l/ V" f> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000) X6 e5 K7 F7 c1 {
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
_5 q+ K( F7 ]3 {; z- e> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
+ G2 c* p3 E5 D' X/ Q, o
% s2 s8 |* X, P发现16进制的地方:
" g Y" Y8 D( ~ L5 ~) T) _====================+ @5 a4 J# U% p, }# H
> sfe f ; 帮助, G' y; _0 P1 @* j8 F* q' E
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
8 j, L" \, {. F4 D2 B# n> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找7 v& R+ x$ A/ h& L6 ]7 Y" }
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
' h4 D8 Z' _) L9 c0 q; N2 r. p> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
5 }7 i4 a6 D. U1 A1 q x6 k" k> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小- p& {- B6 q: O6 N
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes., z$ ~4 I+ ~. V; q8 _3 F$ P1 Z! K
' X2 k# u( z, w& L6 g9 @9 g# n
提取语言数据:
9 N' C F$ Z! T& u======================8 {0 F6 t3 d3 e0 m" }
> sfe l ; 帮助) t; k/ Q' s$ W, |0 z6 ?* A
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据2 W* C b3 E2 N# _8 H
> sfe l src.bin 200 ; 显示 ID 200 的字符串
4 _$ o0 I5 G. G+ a> sfe l src.bin 200 2 ; 用第三种语言显示字符串+ Z9 c- G# f/ X1 H* b
> sfe l src.bin -1 ; 提取第二种语言' M5 c6 i1 V* T4 f) ~: R
> sfe l src.bin -all ; 提取所有现存语言2 v0 z$ x3 D n& ^! P1 N$ E H
> sfe l src.bin 'Testing ; 转换 'Testing' 字符串/ v, Q* O1 |" B8 y7 i
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
$ v4 x* H7 B1 W# g9 ^3 W> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本! Z% |6 }" {3 f- R3 ]* T+ X( s( c
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 + M$ d. [' D% h0 K3 i
> sfe l test.lng ; 检查test.lng 语言包
% X0 v8 Y9 I- |) w4 z& z: ?> sfe lc test.lng ; 检查和更正test.lng 语言包
$ L$ S: |( [2 ]) p( Y* O* M: y5 d5 O7 i( _# C9 m p& [
提取菜单:6 U6 k( m5 H0 b H
=============8 y$ d( x2 x/ d1 l
> sfe m ; 帮助4 J& ^, m) w2 S$ D5 _1 D. r! L8 r
> sfe m src.bin ; 提取菜单结构和入口, Y; z6 B3 S. D9 N; r' e
3 N# H8 C" _! F$ u$ G: ~
) o4 P$ v' p; n5 q% g! n5 C
补丁:
7 s# _- C. v1 y- T( @=========+ i) }, B( w3 I: F/ _. r; J, w
> sfe p ; 帮助( `0 d) k, k" U; E' U) y# e, `
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
7 z s/ U5 B0 j k" t; L ~5 R> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
% B/ q( I( Y- v; s" ?> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz : p, ~5 k2 z. o$ Z
- O8 X; m% }4 Q
, I7 D; v' _6 y6 V' g: i编译: w' h/ F4 R" y v8 w
==========8 a+ F+ ?1 d/ C; n3 O# @$ k
> sfe a ; 帮助4 I' m: v# Q- X4 z. ?' N
> sfe a src.asm ; 编译 src.asm
9 k8 K( ?+ x) j( e6 Y/ e> sfe a src.asm d ; 编译 src.asm, 完整输出2 V# G6 j0 Z5 i8 E
> sfe a "mov r12, #1234h" ; 单句编译
# _4 @: b" C) C2 [/ r> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译' X" w+ o" ]/ v) X; R: ~
> sfe a src.asm,TST ; src.asm编译成补丁格式" i- |( v- s) a3 m1 v3 G) G' M
> sfe a src.asm,TST p ; src.asm编译成补丁格式
# w) ?; W7 J' N! ]8 i( ^, ~> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行% H3 ]4 M( x' X6 p) V1 ?' H, s+ V4 x
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000- q2 X! v, i W9 S4 f) y! V0 a# }
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。. _: a4 Z# y6 g' q/ m7 L+ X8 }
$ ]2 Y8 H- g' l5 E/ J; @) Z*) See Assembler Part to get more 'assembler' function detail; \6 m% E2 u8 v8 C, i
6 L5 a- u/ h; p7 G$ q8 `) ?" J
, R9 _1 w* D# A反汇编:
8 Z' ~, G1 h f=============
/ R/ d0 L5 h0 Y" d> sfe d ; 帮助- Y, k. M( `9 b2 g+ [/ {( P B9 x
> sfe d src.bin ; 反汇编 src.bin
( _7 `8 l, C, H& s> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin; ?- G& x" o) V- A$ B% v
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节
4 q: W7 j& @! W- |4 z7 T' y> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000; g* e) q( E4 |& F1 R/ {# |, a
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止1 y0 M$ N S- v$ x& o. j7 r) z
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址0 c8 z) [* h+ d7 i
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件2 g. X2 U+ m5 ?( @
> sfe d image.bmp ; 单色图形汇编输出
" d! P* Y5 ?3 i% p9 b& E+ m> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
" u* N3 H' O5 B9 ^* `* f. w) y9 C# D% O# B) l2 H2 |4 d: ~% ~9 x9 u
调试:- Y+ }7 m/ X; f
=========0 H- x {5 m7 w3 q) H
> sfe r ; 帮助+ p& }' Y& i9 A, t% y6 W v
> sfe r src.bin ; 运行 src.bin' o& A9 y8 o# n) K
> sfe r src.asm ; 运行 src.asm 汇编文件
) x. y1 S& Z4 U: u' j, H! U1 c' x> sfe r src.asm ,n ; 同上, 正常输出
4 i1 x. F3 |* q7 Q- {* p> sfe r src.bin,200 ; 从 0x200 地址开始运行
8 ^' u) D8 s6 o> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2009 c- T; B* i" \' |5 F5 W; ^% o7 i
> sfe r src.bin b00000 ; 以 B00000 为基址运行+ m; X0 ~* Y1 \$ G
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
1 S) a/ E# Y3 f4 j0 e8 G! Y> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行8 ^! e! n Y+ ]& D' S; F: l" k0 ?1 W( X
1 o" Q) |' z1 w3 k9 f
/ k* x" T( o. C* N交互调试:" x; V( R Q9 Q% o1 `
======================
r7 Z' \) X' ]. P3 v* R. J1 A X> h ; 帮助! F' H! y! G6 d. z5 n
> g a00000 ; 到地址 a00000
, {, g+ t l+ q4 r& l> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)6 U# ~3 v" _+ }- L
> d ; dump 内存 (现在地址)) o* n9 B4 h" i$ x
> d a00000 ; dump a00000 开始的内存& W* K+ w1 t% w0 ]& c7 m
> d a00000 200 ; dump a00000 开始的内存, 大小 0x200$ N" n, P1 n( u- i8 U, ~
> d r ; dump 注册% T$ p& E2 i4 R1 z9 u2 _9 {; K
> a ; 单句汇编, J9 h, K0 i/ q3 ]9 {& L6 Z6 L
> a c7d530 ; 单句汇编地址在 c7d530
2 k2 _- M# u0 c- [> u ; 显示反汇编
7 b0 s9 Z j+ f2 ^, J( |- T> u a00020 ; 显示地址 a00020的反汇编0 s5 s3 U6 a+ T4 l) P& a
> r ; 在现在的地址上执行一条语句
3 l; m+ U1 g' Z> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)
+ E# e/ { f+ R> r 0 ; 运行到返回语句
1 o5 G' m4 C' ]; j4 A; |8 U> r -c7d580 ; 运行到地址 c7d580
: a, b# p) {% ^+ h7 l* D> q ; 退出
2 k# i+ X4 Q+ z3 }* \; |( f5 Z" P
; O5 N! Q" l9 O+ b/ R3 s*) 所有未声明的语句都会改变当前地址。5 y+ X7 F8 Q3 q% _! O6 y
/ O) U$ ]! H9 ~. c
* ^+ G% t% \; R9 E* z2 [特别的助记符:; a, ~$ H6 W( F# a/ \6 n* Q) @
============================/ n# @ n2 L' p' q6 r5 N. S
*) 所有C166的汇编格式
8 L8 J! I9 q0 G, \8 }*) 分号用于注释 (在一行的任何地方)
3 ^ k% C) M" p*) 特别的助记符如下 :" K- x2 r! W$ Y
#include filename ; 包含文件(各种定义)8 l* {# ^- ]! S1 P/ z
#define var value ; 设置替代变量 var = value6 ^5 H0 w" A# i
var equ value ; 变量取值 var = value# { w$ ~* N) g1 @, R2 U/ M$ n
db 'X',36h ; 定义 byte(s) 数据区* k' {3 ^0 w& @
dw 1234h,0,'AB' ; 定义 word(s) 数据区
; Y. G0 {2 Z: Q' @( k* |1 I' r org ; 设定当前地址
( t* {. _9 s) w1 R5 y3 Z5 J base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
: b+ O6 o) t' \' T2 F+ V. ]) w9 c end ; 结束记号
5 z7 F. ^- a6 H0 W4 Y9 e ;#name XXX.string ; 定义补丁名称 (XXX)
+ ^7 Z K# B, f6 k; E/ w f; @* z4 k ' ; 注释将一起进入补丁
+ m+ k" I7 s% ~7 w$ T& G '' ; 注释将一起进入补丁,加回车
- E1 V e+ J1 U# `+ ~ '; ; 以下内容将全部是注释,直到出现 ''
" a( L# k- Q+ G1 Q' B; c9 W ;' ; 注释将一起进入补丁
, W" q2 d+ P- O( ?# g + - * / % ; 加, 减, 乘, 除, 求模 操作
) z1 E8 i+ ~4 L! w$ x >> > < << ; 右移左移操作
# K. ~* X9 T* V & && | || ^ ^^ ; 与, 或, 与非操作
( d( i2 ?, K: j. s val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
' R. J! j9 i9 F page(value),
! K/ \0 y h s! R2 M/ t% l" ~ pag(value),+ r+ q! W; b: M0 E' G% Y! G
p(value) ; 页值 (= value / 0x4000)" m6 d' a% e( Y$ {" ?9 i0 s& f6 Z
pof(value),+ _" V+ m6 J _) \8 m
q(value) ; 页偏移值 (= value mod 0x4000)
. L4 j# _& o \4 D2 C segment(value),
+ t! J; h! e4 x seg(value),
+ I: h' [. W x s(value) ; 段值 (= value div 0xFFFF); \! C; Q! Y- [& ^$ C
offset(value),2 T' N$ I2 ]6 y
ofs(value),
3 w% a. N% a0 u: M' v' N- [ sof(value),
( R8 {- U3 [7 a/ X% a: \ o(value) ; 段偏移值 (= value mod 0xFFFF)
, _" p! b( X; {. p' }
# [8 V1 i2 ~( L# h) c0 L0 D" Q*) 例子:3 v* b _+ F5 b9 t! a
8 x2 ~3 F5 {7 x8 k+ a+ b- ?- y
;--- Testing ---+ s$ P9 s' v* ~5 t: w$ U+ U
) ~. p! }/ \7 N9 N# xbase 0A00000h ; 自动转换文件地址为 SL45 内存地址
# [! n; s& k! l6 q$ B Z
9 l0 X+ \ ^5 P8 N9 z#ifdef ME45
7 T) T% }1 h& Z0 M, [: V- c% v #include me45.inc/ _5 I" B6 a9 N9 y m2 K
#else
. k/ k# C; Z; p6 I #include sl45.inc( \4 b2 M: `2 |# N
#define FreeRAM 37h:3600h7 C J3 }) ~! l) l; s0 \6 e
#define memcpy 0c7b384h/ m: C/ Z. t; V7 F% Y
#endif
: \# V9 M; v7 u9 m: x( |# o3 G
; R( ?$ r' ]; o) L+ `;#name TST. Test Patch ; 补丁名& P: e0 }* `- c6 h# [: T
: S% l; z4 [0 D/ H* o'Firmware : sl45v56. r$ W2 g" ~( y1 S6 l' m9 j# ]
'Author : rizapn
* X$ o; h2 k+ A. v7 j# N'Updated : Aug 18, 2004: E) ]6 _& a* R: j& e2 Q
0 o: t- Y' N2 `% ]. }. j, ?$ Uorg 0c7e000h
6 Y l) b2 v0 A2 B9 Q. E# V mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移9 t# d7 a/ @8 L$ r
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值
9 [3 `+ M2 ^2 ]3 b4 ]- a extp #p(data2), #1 ; 跳到 data2 页8 {; W2 y8 |4 M' ]+ f; f
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
! ~% E" o- r, _! x callr sub_1 ; 页内调用
2 X5 Y: h# J1 I7 b5 P0 R% o movb rl2, #'A' ; 得到 ASCII 码 'A') m; ?: ?* c# [
loop_1:
$ }( Q+ P3 n9 F" c5 t+ r0 g mov r2, #1234h
# C8 n4 a, K; F q! K$ h mov [-r0], r2
' X+ T$ r& v- I calls memcpy ; 调用段表示的子程序: S7 J' A6 S5 g7 h1 I* K
add r0, #2* d: X6 L+ O6 G% a% M. `
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
0 [- y3 f3 u2 y8 g p& o rets3 d8 t6 D/ g# e! N% _1 O
9 N4 x7 U4 V c' g; dsub_1:
K8 X% t- E7 A0 w mov r4, #1234h$ S7 v. @3 ?' J& ?/ Q6 m
ret/ w% M8 K; `5 b+ Z# e! b4 y" i0 D
1 x9 |& D0 R0 P8 a2 jdata2:
# n1 @& O( ~9 V Z% x- G. R6 n db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
% k+ b. v: [1 D" N9 C
% u/ h. {% { A& W6 B1 e+ X. X1 {end
7 H# D: Z5 K9 ~! F( w! F9 s6 y" B. {8 q( p: G" x7 n: O8 |
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3 L8 K) I( ~ `* C
% n% b' p# i/ j* b$ Z/ \* S8 n
Allaahu Akbar,
8 z+ D& J, Z" f: w- p4 T4 i$ vRizaPN <rizapn@yahoo.com>! x g/ z1 {# S/ j
Jakarta - Indonesia
* B5 J: j% `) x/ d5 b1 I
/ \" L4 v8 T2 C2 }- N$ C[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|