- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
% Q) H& _5 i7 I7 O D6 j/ S$ `" V1 p& x6 ]5 A1 A% l7 W
简单帮助:2 V$ H" o; |0 H2 ], o
====================
' Z2 Z+ a) F6 N' u*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。/ ^# U" j5 i# }" _7 C* e5 b7 k
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.
1 G! |- Y# Q' c1 N3 p; |! A
& Z9 M2 V: n) r1 W) \
; ~/ {/ e) X0 P0 V7 G- Z! p搜索空白区:
5 L8 J# j; H$ O4 M W) }) Y=====================. n; c% G% \9 [8 n2 l7 W$ z( ^
> sfe 0 ; 帮助 \0 R2 x' T& E: g" I+ i
> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
2 N1 ?. G5 r- A8 Z> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间! o$ n: I% i+ S; g; g% ]4 n
% Y6 u( @, H. M二进制拷贝:
* {* V* U9 A: r- {1 A z============
% |/ c$ k, V5 x> sfe b ; 帮助4 |! i6 n+ C! P. a" W# ]
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin+ j& F! F7 B- N! X
> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin0 B9 ^, L1 a+ _, C/ |
> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin: d& R% \' D4 {; I5 _, N6 \( O
> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x200# c# e3 N! \- }1 {% u6 }! _, Y
/ g: Y# L7 i: B8 O比较文件:
: c/ _$ X" [$ f( k$ K, v==============5 f6 m% y3 G1 f" u9 m8 m0 K
> sfe c ; 帮助, ]9 \2 \$ d& q# z; n% W+ @
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin% N: b9 |8 u; B5 b9 _! R5 H
> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
% m; `, {( F: e; w) u> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes0 C0 W) r/ \" p" {2 s ~+ i& @1 v0 q
> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )
( A6 t4 A8 [6 m) M3 {8 v% ]> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
! p3 i) f, P2 q> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
( h. H" x: @8 b> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
. r( e# A! j- |3 i' H5 I, \" @
8 S, e2 n; q S! R2 [' c5 K; @/ D: M发现16进制的地方:" _3 G0 h' H5 Y) P: k
====================
, y) r5 G" o0 K3 j: }> sfe f ; 帮助+ ]4 l, O7 Q+ U5 d, V
> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个9 t L2 K* w) d+ e
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找
* f$ B2 _5 I- I8 [8 l( @> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes& u8 ~/ a( j$ e& D
> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
, c' b$ }, ?' V9 k> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小9 _( X' u+ v$ q W: i- F# J
> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.) B2 ~; _7 g( Z) e% ^
: D; n& l, U0 W+ a, i) u3 ^! Q% i提取语言数据:5 n( { o6 e2 _' ~) H% c0 n4 G; Z7 o* f
======================$ v& N3 {# k+ ^& i* c) P6 e; Z
> sfe l ; 帮助3 _/ _8 o! W9 S0 \7 e( c7 A
> sfe l src.bin ; 提取第一种语言,包括扩展文本数据$ W. P9 L& \! L& c* o; T. G
> sfe l src.bin 200 ; 显示 ID 200 的字符串6 F( @ ]/ `9 @( z, F0 l- O
> sfe l src.bin 200 2 ; 用第三种语言显示字符串" P9 s2 V0 }* R, `* T8 L" z& t
> sfe l src.bin -1 ; 提取第二种语言4 v; p& u" u1 c9 _. Z
> sfe l src.bin -all ; 提取所有现存语言
% L2 k# G" T; Y6 e> sfe l src.bin 'Testing ; 转换 'Testing' 字符串; C& p8 C3 V* @* P! Z
> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言)$ C+ ^' t& y/ m3 U# h' R L7 t
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本
1 [6 }7 g+ l" }% ]6 D+ N> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁 ' r. @& k7 U6 G' A0 r8 U* H
> sfe l test.lng ; 检查test.lng 语言包
! ^+ a2 p5 N: o( E$ y> sfe lc test.lng ; 检查和更正test.lng 语言包& z! o8 j& z# e1 G
3 ~. ~. n8 i) p. G) s/ @& h- d
提取菜单:
4 V% Z$ n6 ?% x5 ^=============2 ]6 V) u3 U$ F/ s4 H* d1 @+ d( V8 {1 t
> sfe m ; 帮助! r7 [% R# i; B
> sfe m src.bin ; 提取菜单结构和入口
J, _6 H: v0 X# k. I- e4 m- j; f& {* L
: | k8 [) d& p* F$ S* L3 z- L
0 h5 ]9 ^& E p( L/ N* }: {' S补丁:4 n/ ^0 Z8 G$ }& b' Y; |
=========
$ r$ Z* c" p% F3 `: O6 l# Z2 w* {> sfe p ; 帮助
0 e" g6 r- l: S* n; v1 H* `- q& s> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin& Z! G7 \ B5 s; M9 w$ E; O1 j' t
> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz" n6 c9 |& P3 j9 \, g, m% Q
> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz & h1 t5 S/ T; U! Y7 ]9 w
5 _, l" l0 L5 _7 f3 w3 q) I% Z
" a" T, _4 [$ i, _/ ~/ c编译:' K2 F; V$ O$ v1 u# a) A& t
==========2 ~* T) D( I& U2 v" Z6 p
> sfe a ; 帮助
! [. D# [! G9 c* b" o: ]5 x' B ]> sfe a src.asm ; 编译 src.asm
5 |, q% [5 w6 r$ W! ?> sfe a src.asm d ; 编译 src.asm, 完整输出* T# q% f# Q7 G" l2 E5 I
> sfe a "mov r12, #1234h" ; 单句编译$ X. n; P1 ]; N; [! x l* ]0 Q- b
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译
$ d; S$ p9 I7 X) H, L9 [+ |* P0 ?> sfe a src.asm,TST ; src.asm编译成补丁格式" p4 {, t- X& f* }5 v) G4 E
> sfe a src.asm,TST p ; src.asm编译成补丁格式
, P% [- ~' G! v3 v7 t- V$ `> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行
* U/ I% g' z" L5 q N> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000, H! M: _/ g5 k9 f$ w# @; ^* c
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
0 l! E1 K* T. L+ ^4 N3 r/ `. ^# { n F. y# p
*) See Assembler Part to get more 'assembler' function detail' t3 ?& ] v o; Y
! [4 K. p% V$ X6 ~% M/ L8 L
$ t' x# O! N) I; i/ c" W( t
反汇编:
' f6 M- y' ]" h# F: K=============
; W9 @' C/ Y% p> sfe d ; 帮助
6 S1 Z6 F* u7 V/ T: B> sfe d src.bin ; 反汇编 src.bin M% ~1 o% y6 R" v, x
> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin8 h: Q' A. [; E' j
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节# u3 e. K; C. d1 R
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A00000
' g9 i6 o1 X5 |3 V> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止! R/ i- r8 v2 [( N/ k
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址6 o' P8 v1 k `8 }
> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件
1 `" Y( c0 ]: G* {> sfe d image.bmp ; 单色图形汇编输出
9 s b- Z4 P, p" n8 r- r+ W> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。' g: m& U @1 M6 v6 `
?. v5 m' s; b
调试:* A1 w7 c W6 s# b2 p( H
=========
) L5 D; t$ s* k( A> sfe r ; 帮助" T6 j( X: q1 e! f
> sfe r src.bin ; 运行 src.bin7 k" c' r7 z. {
> sfe r src.asm ; 运行 src.asm 汇编文件4 f9 U- ~( V, b9 N0 M
> sfe r src.asm ,n ; 同上, 正常输出
: }( \2 j1 t- ]% ^> sfe r src.bin,200 ; 从 0x200 地址开始运行
2 S" V9 ]; T3 F1 u; u4 _> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200) c5 \, R3 i V+ P
> sfe r src.bin b00000 ; 以 B00000 为基址运行# J% ?, d: A# a; U, E2 A, {
> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行/ _7 r, ~, O1 M- W5 C
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行5 ^ z& S3 @( M
- ^1 O+ {' U3 z# |
% P& l/ @; ]) l交互调试:) |3 `$ |$ y" c0 U
======================# j/ K: f7 C+ |* x
> h ; 帮助$ ?9 c3 \, T0 @! P. j
> g a00000 ; 到地址 a00000
* g. \. l! R; r. h3 X8 g# a> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)
+ X. y" n) ~# z, m7 O4 G# o> d ; dump 内存 (现在地址)0 M' \$ l r* w( C( l1 t
> d a00000 ; dump a00000 开始的内存
4 L1 U5 s5 v" D6 v> d a00000 200 ; dump a00000 开始的内存, 大小 0x200
* m$ M& x9 g8 F& U, I0 A> d r ; dump 注册
4 ~+ v+ _/ {5 }: y# o> a ; 单句汇编" |4 Y, i. C& B' n+ s: F. o2 K
> a c7d530 ; 单句汇编地址在 c7d530; \1 c# W0 H$ B6 J
> u ; 显示反汇编9 V8 M2 X( T; S1 a+ y" B. E- _1 I; ?
> u a00020 ; 显示地址 a00020的反汇编: H' A1 d. [: A( i9 J3 z
> r ; 在现在的地址上执行一条语句+ R0 ^2 x" B4 s, K) ~
> r 1 ; 在现在的地址上执行一条语句 (跳过call语句), H- ?7 w8 W' ?/ @/ V
> r 0 ; 运行到返回语句3 X: w6 o4 B8 a# C I
> r -c7d580 ; 运行到地址 c7d580& G: b9 z5 }; i7 x0 _$ i
> q ; 退出
% j9 r& o* O S) V0 F; n0 S2 h/ g
; J; I1 L+ V+ c9 K' N; J*) 所有未声明的语句都会改变当前地址。
2 S" s, Y& G5 I, Q# X; u8 Z- c7 z ~! I6 z2 |
( D* ?2 Z# D8 M1 d! [! y) B9 B. @特别的助记符:0 R6 i3 j4 C7 I4 ~% h3 i9 W8 U! e
============================
) U/ \6 C: r- s, x; |*) 所有C166的汇编格式2 g' r- c+ j9 c7 h' q' n. k7 B
*) 分号用于注释 (在一行的任何地方)
" D) I: r1 e w* ]*) 特别的助记符如下 :. S0 L% d) _7 f* |
#include filename ; 包含文件(各种定义)
' e. v& R% S3 V- Q #define var value ; 设置替代变量 var = value/ } _% L6 u8 o2 y. @1 y+ C
var equ value ; 变量取值 var = value( X7 q* d+ r8 D& p- L$ J) E& e
db 'X',36h ; 定义 byte(s) 数据区; W6 ]9 W6 n2 R3 u& _3 ~$ b- j
dw 1234h,0,'AB' ; 定义 word(s) 数据区
4 k4 U9 y4 w$ H4 u% w org ; 设定当前地址6 ?6 b' A) i: U ]9 e" m7 A
base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
( i8 \! _1 V. n2 K+ a0 k end ; 结束记号6 I4 s+ P* l# h4 _1 r
;#name XXX.string ; 定义补丁名称 (XXX)
8 d# {. E' W, o; u% m ' ; 注释将一起进入补丁+ E; B8 t% w# p0 T8 F2 |7 D
'' ; 注释将一起进入补丁,加回车- D8 Z2 `: X& c9 z; B
'; ; 以下内容将全部是注释,直到出现 ''
. N, w5 V9 r2 s( a J5 h ;' ; 注释将一起进入补丁
" [/ H C& C/ q) K/ @3 w2 u + - * / % ; 加, 减, 乘, 除, 求模 操作
e( `0 X3 ~1 N >> > < << ; 右移左移操作
6 x. E% Z; u% S2 a7 ]8 p & && | || ^ ^^ ; 与, 或, 与非操作4 L. c) m9 p* Y
val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)% f" h3 C' j% k4 C; t
page(value),
( d& c+ O- \* L% ~ pag(value),* [. H0 C- f: l& N3 x( |1 O# ?& B
p(value) ; 页值 (= value / 0x4000)
4 _9 ]9 @) l4 X) @4 g! H% T' m5 C pof(value),
$ L, Z1 l2 b# S; _! [& | q(value) ; 页偏移值 (= value mod 0x4000)
, n/ g, F+ s5 S: E5 ^7 H segment(value),
% V, e* `7 A8 g, S) c+ ^ seg(value),
* R6 d% u8 t! a) Z y s(value) ; 段值 (= value div 0xFFFF)
/ z% D% L; f( r& ` offset(value),
) S! n( B/ o& n( P( K7 c& m: s ofs(value),
" k: }# t+ M3 l: P( A sof(value),7 w& k. ]; A N4 M$ V) S
o(value) ; 段偏移值 (= value mod 0xFFFF)
- _1 i9 Y3 _. D. R, } `3 w( M
7 z2 b5 m3 E- y" m*) 例子:
?. Q( I& \8 A( Y( E; e! H/ z9 _6 u6 Y4 p
;--- Testing ---1 d- @7 T$ E6 G. e
( w0 P: f9 O3 {7 }" E* J
base 0A00000h ; 自动转换文件地址为 SL45 内存地址4 W# w: E0 `& E6 V0 N0 F
2 C% [& z* G4 D#ifdef ME45
6 j6 s6 L5 e4 G& s7 d #include me45.inc$ A* Y! T; H8 {6 [. b$ Q
#else' {% k9 B8 ?$ n; ~
#include sl45.inc
4 h3 ]) s1 \! N; o2 X. I #define FreeRAM 37h:3600h
4 ~/ C. r& Q1 @4 S% g. |( u6 {+ u #define memcpy 0c7b384h, P& p- h- b9 g4 r3 y! k; V. R
#endif
# O5 n" ^3 K) n0 y0 _8 m E, l
K, Y1 q, }/ E;#name TST. Test Patch ; 补丁名
# y& b: J8 P) y" T6 u# U& a9 t( i" k" g
'Firmware : sl45v56
! t$ w5 X: F g1 L5 ^& G0 w8 f+ i'Author : rizapn! v" ~5 j' _1 f; @
'Updated : Aug 18, 2004' F- u: E3 S2 \! n% e3 o; B# r& N
/ u0 X9 m; w* Y5 m7 Horg 0c7e000h
+ r) a$ ?6 W9 T' K* p7 n mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移* S$ ^ l& p9 {% }- }
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值( S( v( J% j1 u, ]5 q+ a' k T
extp #p(data2), #1 ; 跳到 data2 页: T" M% j9 t! g% x3 n
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h)" z i) E5 s9 V; x: l
callr sub_1 ; 页内调用
; l! r; @6 I8 @; U movb rl2, #'A' ; 得到 ASCII 码 'A'* {4 p" s; K: G
loop_1:
' b8 \" S1 {) o5 ^! E- F& u mov r2, #1234h
5 o4 [7 T, ]; c: U C; d mov [-r0], r21 v( x% Q3 I6 P; E( B; K
calls memcpy ; 调用段表示的子程序
! w1 ^, f* [! O5 {: D add r0, #2
1 C8 k, R' ?( r4 v jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处6 m1 w/ k5 ?9 f8 ?" Y% v
rets
4 J$ C- ~- x# m$ A4 N. x- a5 x
1 z2 t8 ?1 g; z$ C @ {, ysub_1:- V' w# b8 q! |8 a1 D" E
mov r4, #1234h
e( o1 }9 {& A) P& ~ ret! [& z4 V" w4 F+ a6 Z! w4 D
& W# H) k* P+ V8 G& N v8 Z
data2:
% v' }' S2 j1 C9 b( Q* U0 n- P, y" j db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
2 z/ y3 ?6 i+ d. C
+ D0 i# ^6 ?2 Z Nend& T7 N. E; A0 i( W
2 ]3 [! ~4 w9 |& @5 ?;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~7 s4 W7 w$ a& Z( O6 e
- ]! H" q, x5 v6 q- ~, i
Allaahu Akbar,2 D; k6 [+ u# ]8 N' M, a
RizaPN <rizapn@yahoo.com>
) o0 e. b) u& Z* v D& I* GJakarta - Indonesia
* I( s, M5 A" w. z- a, ?; x
W6 k% R$ f; Q1 m( N3 t" p[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|