- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:6 \& L4 u) r/ e& a6 y9 P \3 N5 f; }
% E n+ P' }" n7 u* g4 S
简单帮助:$ p3 K9 P2 K, L6 k _
====================; V! q& h1 ?! M6 s( `8 W9 Z7 d
*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。( y3 v1 P M" u& K: o+ M
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.; h2 n4 t3 i$ Z
1 ~! `4 [7 t S7 J- M4 f. M
) ~! W. P3 y& M3 Y' X4 R( ?$ v" y搜索空白区:
% y9 F* K" b6 i. @; w2 R=====================
0 s8 Z# b, `: ~+ `> sfe 0 ; 帮助& Y! A' T% s& Z
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)6 E2 z5 j5 |! d: {8 }9 g
> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间/ \6 \, }+ p, n o+ N! T
& ? N# |) {" B! J- I# ]
二进制拷贝:( ?/ y0 N6 F3 e5 z5 T7 Z1 a
============
9 R8 w- o1 p" P% A> sfe b ; 帮助
, {7 @1 ^: Y( J' w" K/ s! G; h> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
5 p; S( ^2 r5 q> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
; m8 G0 Y1 l" x% e3 n> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin
% q1 U! [( n S7 ?- d: L> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200( B# d# r1 ?5 j% I
t* m: @, P; n比较文件:2 Q9 @. n1 C+ w( G
==============
1 v" B4 k2 n* z8 {( f9 v> sfe c ; 帮助0 O G, E$ H7 k% \# {% u
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
$ A1 I8 K" E2 ~, P2 V> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
, L) u, x9 {: G. W> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
" w2 I3 P6 @, N, i" ^> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )+ F# P) I0 @4 f$ L* l: L
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000- u/ {1 U8 H: W4 m. V7 K; D
> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
- P% ]0 ]/ x, e G* p! O# h> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
$ K% X# ?, G" ~/ @7 K8 d
# @& Y& t1 q1 n* ^7 ]1 l) e发现16进制的地方:
0 j" Z7 P0 i/ ]# G8 i" Z( p4 u$ Z+ @====================
8 n0 ]$ ~5 k: `5 E( _> sfe f ; 帮助
- j& x, t" ~ z" _> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个
/ F {; Q2 ?; m' b7 t' D> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
, g1 @4 O" h7 `% q> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
% o% Y3 g6 d+ S; A> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
- b; E% g- Y4 y+ {> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
+ q) P/ i1 o1 p( o' o> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.. n# k# m& f# z& I! a4 U
$ b$ D3 e! ]9 t3 m提取语言数据:
3 K! ?1 Y7 q$ j9 o( Y======================
3 O7 G* m- H% j) } A> sfe l ; 帮助1 M; R+ t) k! }& T8 S) u2 R
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
% K" G% H1 x6 q+ ~5 _! P" d8 v" d5 e> sfe l src.bin 200 ; 显示 ID 200 的字符串! u9 H/ U: x m+ j2 G* y# i4 b& |
> sfe l src.bin 200 2 ; 用第三种语言显示字符串
& ^+ ?) o+ A' h# @2 }+ E$ l' w> sfe l src.bin -1 ; 提取第二种语言* p* P0 R3 h* E& p; A
> sfe l src.bin -all ; 提取所有现存语言
, E2 x5 x# D% R9 E; R. Q7 h T> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
, ]) X) [ k1 Z7 t0 r* y> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)
* F, y& p/ q% R3 x6 Q1 s+ W. W> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
' q8 G* C" h8 }" e, X' Z: M0 }> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 8 K! `: O. X, v8 I( ~
> sfe l test.lng ; 检查test.lng 语言包. p4 n4 o* o4 Y! W! Q4 a' b
> sfe lc test.lng ; 检查和更正test.lng 语言包) E' s6 j. ~, i* d+ P' e
3 N6 ~4 ]7 V3 @提取菜单:# u. R: X+ D) k/ e
=============
6 q' `8 C' M A4 m6 ?> sfe m ; 帮助' q" \. x! S! q
> sfe m src.bin ; 提取菜单结构和入口
6 `: Y* i$ [( }( a n) q, M
. l# o, N' S8 D% x$ _' }" K5 b K' M5 N5 e) v) r) B& ~
补丁:& T$ @: M. a* E
=========
& t2 e. ` e8 o9 C8 r4 C- ~> sfe p ; 帮助. k; Q6 q& D0 m: Z y
> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
G. q D5 _) S% M& \4 Z& v$ }> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz \# O. O% ~9 P! m
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz
5 Q6 V4 A: H% C3 ^& T/ B7 H: m; a6 X6 { v& v6 A" H4 G
2 E, w$ Q4 G. M0 E; c. R编译:) e& m; Q2 u8 _8 i
==========
& h3 m+ s G, o7 }> sfe a ; 帮助
! _3 w' \5 [$ o' a0 T8 [' q8 e. I> sfe a src.asm ; 编译 src.asm4 D; |( k, L: ^
> sfe a src.asm d ; 编译 src.asm, 完整输出0 q5 Q! \. i1 R% k6 D3 R
> sfe a "mov r12, #1234h" ; 单句编译7 I- n7 ^8 V$ f0 K
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
% s3 X" R) B0 E: ]+ [, J. |0 E/ B> sfe a src.asm,TST ; src.asm编译成补丁格式
' a+ I" M6 j, u$ J% a> sfe a src.asm,TST p ; src.asm编译成补丁格式' q2 g4 a% R, y
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
: q5 X& y( y" a8 ]> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000
' b% x9 C1 @; m4 S4 U> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。' W9 B- v2 g4 R& O9 T6 G% y/ \
( w5 C/ u* }9 M*) See Assembler Part to get more 'assembler' function detail; D& M) p' K e8 ~7 }7 z5 x
( X, C1 ]6 Y; ^
$ z+ g; g9 l0 G, ]9 w8 m( v; @/ N
反汇编:- K; X8 ^& ?# ]0 ]
=============
6 u7 F3 l, _1 ~7 d+ S8 B% S+ I6 s6 X> sfe d ; 帮助3 i: }" c: F/ T6 V& X! h
> sfe d src.bin ; 反汇编 src.bin
+ W4 ?* P6 p$ D1 y> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin& ~4 h. \- z- U- B+ ~* A7 _3 @/ Z
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节1 E) w7 o5 I7 S; u
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000! e, ?0 O2 |! z, B8 s% `% N! B
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止
' J3 v8 o! v5 Y9 {; d> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址0 r0 Y; }) [: y3 X9 O
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件9 z7 H8 j% b( b# l
> sfe d image.bmp ; 单色图形汇编输出* `, S- n0 X {- g- G: G$ m
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
& W. W5 e+ @0 V$ f/ ?3 ~, Q; W% {" i3 P" C$ P
调试:
/ i" ]0 E( R' ?. X=========& ?- a! d* @$ L4 v) m( Q$ t
> sfe r ; 帮助3 a" J( O, X' H- c1 R+ H
> sfe r src.bin ; 运行 src.bin1 L2 y! N! X4 U- M4 \4 P) g
> sfe r src.asm ; 运行 src.asm 汇编文件
6 N8 {4 T- l6 x! d; A+ @> sfe r src.asm ,n ; 同上, 正常输出3 x( E: Q8 d, ^$ {: p }" i
> sfe r src.bin,200 ; 从 0x200 地址开始运行
* ~5 d: n# e) ^7 I) q2 }> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x2005 X6 M' p4 ~* r8 G2 u9 x0 M
> sfe r src.bin b00000 ; 以 B00000 为基址运行. i e t5 `. x0 j
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行
- u: b7 P6 H/ q- ~# v> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行. F; M( B4 Q4 k& r X, n7 J1 N
" y& Q$ ?/ O* l5 k2 q9 v
S/ Q0 `( B- h. g+ J& T交互调试:
- [1 J( T" C$ Z$ s! K4 J" P======================
9 H2 ^8 O" @3 N( @1 t& O& X# s> h ; 帮助( b6 M* j4 K, y0 n4 g
> g a00000 ; 到地址 a000003 t4 ~% w7 M a7 A
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)! ^4 [+ n4 ]: H$ ^/ y
> d ; dump 内存 (现在地址)+ q" j% S% {5 S% }; ~
> d a00000 ; dump a00000 开始的内存
( @! f3 P; V; X* G0 _5 l> d a00000 200 ; dump a00000 开始的内存, 大小 0x200. Z [: J# A; b: G+ A; j, q
> d r ; dump 注册
$ }5 A) k; H, T$ [0 ^' b5 e> a ; 单句汇编
$ F6 B% D( ]" U" R4 ]- {> a c7d530 ; 单句汇编地址在 c7d530
& ?! }# b2 z& N# c0 @/ k; E8 U> u ; 显示反汇编7 N' s$ I2 U" V- ^: K
> u a00020 ; 显示地址 a00020的反汇编
; ~' S' Z% c. V2 c# m0 i* N> r ; 在现在的地址上执行一条语句1 m: \7 C7 R! c+ E* u! |# _
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)' m+ B/ P" f y/ U
> r 0 ; 运行到返回语句
4 f- u9 L+ V) }> r -c7d580 ; 运行到地址 c7d580/ P X0 ]2 d+ P4 `
> q ; 退出
3 w7 A3 W$ p9 V1 i$ t9 B0 M
3 ]5 i6 Z! ~# f( d& H6 F- _! K*) 所有未声明的语句都会改变当前地址。
7 i( Y4 P& a) [3 P
) R' i) @9 m9 ~! w5 X/ }
/ M0 i" |' l1 `; N1 ^# R特别的助记符:
9 I) f' |0 q5 Q& D. G) `============================2 |+ E8 T; v0 v: F" n
*) 所有C166的汇编格式: d' q* R6 w& z1 F; u5 D3 i
*) 分号用于注释 (在一行的任何地方)
$ f0 b. d, `4 v/ A*) 特别的助记符如下 :2 J" L5 ]6 W: d" ?0 P) K
#include filename ; 包含文件(各种定义)
: R" T9 f1 a5 I8 M8 I #define var value ; 设置替代变量 var = value
2 c% k- G3 q3 V$ Y ]9 C$ m) l var equ value ; 变量取值 var = value
0 U2 ?; s# I& R7 F7 W1 M# o& s db 'X',36h ; 定义 byte(s) 数据区
! T5 B' E8 W$ i8 t5 x b% N dw 1234h,0,'AB' ; 定义 word(s) 数据区 Q8 b, l! _/ I4 q- b4 E: P
org ; 设定当前地址
. o2 o+ y7 l! d" [2 t1 g0 i; i base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
5 t$ ` ^; i1 d$ d! q( v7 I* t end ; 结束记号6 _3 u& I9 C ~5 i. e/ T
;#name XXX.string ; 定义补丁名称 (XXX)" y; s; z0 B' w* X
' ; 注释将一起进入补丁$ _7 ]0 E; X/ m/ K! X8 {6 b
'' ; 注释将一起进入补丁,加回车. P; r5 ]/ Y3 b2 N8 {
'; ; 以下内容将全部是注释,直到出现 ''
4 _+ ~: H4 B2 y$ b. z3 S/ x6 F ;' ; 注释将一起进入补丁
4 D3 X* y7 T& _# r" ] + - * / % ; 加, 减, 乘, 除, 求模 操作
2 } |& G& g. q >> > < << ; 右移左移操作! I$ W+ X+ _8 @- R) | v/ N7 C
& && | || ^ ^^ ; 与, 或, 与非操作
9 D4 \) O6 e) ]3 c) q6 r val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)1 k2 S6 c) K1 s
page(value), ) I" ?( U- r" A( X" x
pag(value),
! c0 |, X( [/ [0 ~2 y) q9 l9 o p(value) ; 页值 (= value / 0x4000)
8 W( i* O7 p# T* _* c6 t' ~2 M pof(value),
( |8 G2 Y8 o3 ~ q(value) ; 页偏移值 (= value mod 0x4000)* O! k: \( y0 P" J# h5 _) X
segment(value),
' ]& N' Q0 x a( p; \ seg(value),
. t# n" k' Q/ j7 w s(value) ; 段值 (= value div 0xFFFF)
/ y6 b- y/ L. J offset(value),
+ w2 z6 o+ [6 T: X7 u, e- |& c- F ofs(value),
$ v, H% [3 {# G1 l# Y- M! m" z sof(value),
6 a' W* }3 t8 ^ o(value) ; 段偏移值 (= value mod 0xFFFF)
" Q1 j: ~1 B2 D; b% o2 l) ^" _) Z" ?0 {7 ^ u, ]9 C
*) 例子:
; B- K4 c/ J; P( X* d9 c, `
' [( w' {) p @8 s0 R;--- Testing ---
" ]; C. e* d5 G3 o) d0 ?- U+ ]
. q/ x9 Z5 B3 ~+ j! cbase 0A00000h ; 自动转换文件地址为 SL45 内存地址) C, G* L0 r. d& R/ q D0 d% U
2 A' {4 A$ x9 w u#ifdef ME45+ ]5 S! L9 k1 n" X& `' ~" t
#include me45.inc6 U% W) Q' D X* n
#else
g9 e% H) l% T, p$ c0 x% ~ #include sl45.inc) j5 u1 T/ L9 Z$ ^8 F6 N
#define FreeRAM 37h:3600h
8 m( {7 v f6 m' n* W7 r9 Z5 \ #define memcpy 0c7b384h
* y8 r% _9 i6 q, |$ P% T#endif
# M4 y% X2 ?7 L! R: `1 l+ O3 Y- {. K. ~$ S' k
;#name TST. Test Patch ; 补丁名* Y: |$ L8 x" n* [$ o
7 Q n K( N" h p v5 D! v
'Firmware : sl45v56
- b8 U% T. R- L) g5 }'Author : rizapn
' i$ ^& m* x6 M- h5 F'Updated : Aug 18, 2004/ r0 t$ a }) U; T( y7 _
5 J& H6 ~+ y! ~org 0c7e000h; a* p2 Z; b7 _5 Q" H' z. Y
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移
* f& o* l/ {3 d0 q mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值/ D u- t6 W0 N5 ~4 D+ o9 }: Q9 q6 A
extp #p(data2), #1 ; 跳到 data2 页
5 O8 w y' V+ ~9 O4 O' Q r" O4 u movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)
8 b. x$ G5 C9 g callr sub_1 ; 页内调用
' W4 N5 s! Z8 A% u movb rl2, #'A' ; 得到 ASCII 码 'A': a, |( E4 N3 c( q) Z& X$ \
loop_1:
2 E( Z w/ \0 c2 D, q+ x, g mov r2, #1234h* S4 A; Z! @3 I) a: Y4 Z r
mov [-r0], r2- C* e) i- r; P0 \
calls memcpy ; 调用段表示的子程序
8 L3 X. I' y0 k% [; M( Y" I; ~ add r0, #2) `' F" s" h" i
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处% z0 T" ]% |6 s2 w
rets
8 Y: G% I2 y9 R9 a+ s) J: o" m
$ Z9 l1 L) f1 A6 W4 [# Isub_1:
4 }2 z( E) y: L) e8 u( p mov r4, #1234h
( q- B- b( p2 c3 z6 ^9 \ ret
+ y0 [ l8 {5 H5 S0 t$ p( X9 f6 F5 F0 _# R+ G! O- O q8 Z
data2:
v, A, Q1 t7 _+ M db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
: \$ ^4 D* T& D: Y! [/ b5 F. @7 A6 T# F4 y3 V! H0 P+ g/ E% C4 |6 }
end
5 H' ~& D& W) ?, e) S
! F L$ |3 B9 z0 \;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 l) R+ Q' d* C3 ]& ~
3 A6 X+ R8 o9 a3 ~# W! lAllaahu Akbar,; L/ J- B2 d6 X5 \
RizaPN <rizapn@yahoo.com>
, V5 {2 v0 D2 P4 XJakarta - Indonesia
7 }3 b7 t: O' }( C; d# K1 B G- Q) f- ?' r/ G# c7 r [# l
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|