- 积分
- 102
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
sfe.exe是一个强大的工具软件, 以下是我翻译的说明, 有些地方是按自己的理解翻的, 不当之处请同志们指正:
1 x; G; ]. [" \9 s* m/ A& b4 M" y+ w s# @0 D r
简单帮助:7 L0 F0 {* [2 t+ H
====================
2 a: Q. b2 v) d) A+ w5 ]*) 在 Windows MSDOS-提示符下, 输入 sfe.exe (必须保证 sfe.exe在可搜到的目录内), 然后你将看到帮助说明。0 Z0 n6 A- \! Z, F0 N
*) 想得到更详细点 (不算很详细), 输入以下命令, 比如 : "sfe b" 将得到二进制拷贝的帮助.! |% a0 i) g' ?. d- V2 D
/ \; ?+ r" N) K1 J
6 C, h, N9 s+ b- V( O搜索空白区:
% z/ f! ~ ~ X6 q$ T8 P=====================
# Q' |( U7 L' T% p> sfe 0 ; 帮助
1 \( I9 U T. l3 S7 I> sfe 0 binfile.bin ; 搜索空白区 (默认大小 = 0x300 bytes)
( w, K; x4 g& i) k> sfe 0 binfile.bin 1000 ; 搜索 0x1000 大小的空余空间
- N6 V% b5 _. s9 O6 _- V
% |$ X Z6 k2 P+ w* t. q二进制拷贝:3 M7 {; b8 b, T, `
============
' i5 a' ~$ y5 p+ ?> sfe b ; 帮助# j! m; ]) W# z2 ?! G
> sfe b src.bin dst.bin ; 拷贝 src.bin 到 dst.bin
: J2 ] l& r. b" `> sfe b src.bin,20 dst.bin ; 拷贝 src.bin, 偏移 0x20 到 dst.bin
7 y6 ?$ g9 `, K( V [> sfe b src.bin,20,100 dst.bin ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin. v8 r+ V/ n! o- U( W _9 o
> sfe b src.bin,20,100 dst.bin,200 ; 拷贝 src.bin, 偏移 0x20 大小 0x100 到 dst.bin 的偏移 0x2009 D H Y& e- d8 [6 |; V
# R0 L2 v4 V2 w9 i" x1 X/ J比较文件:
7 X: G6 s$ F8 p; w- V; U==============
+ E m! a( |1 w( N5 S: z> sfe c ; 帮助/ J; \5 ]7 J$ c) c2 x
> sfe c src.bin dst.bin ; 比较 src.bin 和 dst.bin
! R( U8 S. z; v' l; H> sfe c src.bin,20 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )
; E# F6 {3 o) e* s' }7 H> sfe c src.bin,20,100 dst.bin ; 比较 src.bin 从偏移 0x20 (与 dst.bin )大小 0x100 bytes
$ ]4 I+ V5 d, n6 \8 A2 y> sfe c src.bin,20,100 dst.bin,300 ; 比较 src.bin 从偏移 0x20 (与 dst.bin 从偏移 0x300 )% G% M: s, T% B. m
> sfe c src.bin,20 dst.bin a00000 ; 比较结果显示地址加基值 A00000
& V9 ]# w2 l: L! d> sfe c src.bin,20 dst.bin a00000,16 ; 比较结果显示地址加基值 A00000 每行显示 16 bytes
% C$ T0 i8 w. p3 E% Q> sfe c src.bin,20 dst.bin a00000,16,all ; 两个文件都显示(不仅是不同处)
# y( q, [5 J: V
- {! a7 F7 V3 l2 A/ {; H1 d发现16进制的地方:8 r" ?7 ~4 h# W* l# G
====================: B- S. w( K4 X
> sfe f ; 帮助
* d" Q9 {; h9 h& N> sfe f src.bin e6,f?,,20,e6 ; 找类似 'E6 F? ?? 20 E6' 的地方,? 代表0~F任何一个( n4 @) Z( r u+ L# h
> sfe f src.bin,200 e6,f?,,20,e6 ; 同上,从 0x200 开始找$ `& N ^' S( @6 ^/ x
> sfe f src.bin e6,f?,,20,e6 10 ; 同上,显示 10 bytes
+ v: }+ p! Y) S$ c' z> sfe f src.bin e6,f?,,20,e6 10,4 ; 同上,是反向找
8 P& m2 q. U, o! J, G' y> sfe f src.bin 1234 ; 显示从1234H开始的内容, 80 bytes 大小
( o3 A3 L: n$ B% ]1 y> sfe f src.bin 100:1000,8 ; 显示从 100:1000 (页:页偏侈),大小 8 bytes.9 M) T, B7 q. t; n# { F
7 {5 q% u6 |. w4 v; ~' R9 A: \ a
提取语言数据:" H$ D8 ~" j) f5 l; [& e, y. A
======================* i' G: x) s8 |
> sfe l ; 帮助
: \* ^8 M8 Q5 y0 v> sfe l src.bin ; 提取第一种语言,包括扩展文本数据
4 K& Q9 X# ^6 c+ D; x) i+ g3 N D> sfe l src.bin 200 ; 显示 ID 200 的字符串* j) N( O( Z, {' z9 T
> sfe l src.bin 200 2 ; 用第三种语言显示字符串; @# T- W4 \$ U/ n1 b* D& `1 l) ^) q& p! D
> sfe l src.bin -1 ; 提取第二种语言9 e7 H9 @1 F! O8 S3 k# ^
> sfe l src.bin -all ; 提取所有现存语言
/ c. d- l2 \' t: t u6 j; u> sfe l src.bin 'Testing ; 转换 'Testing' 字符串
/ {$ B5 r$ c2 J0 l6 l d> sfe l src.bin 'Testing 1 ; 转换 'Testing' 字符串( 用 ID 1 语言); P `' a' ^% @2 T. \
> sfe l src.bin "+41 8C 91 56 4F" ; 转换16进制文本9 c( s3 n- W8 x3 {4 p
> sfe l scr.bin 200,"<95>Test" ; 用字串 "<95>Test”更改串号为 200并生成补丁
; l% c0 {) K8 x> sfe l test.lng ; 检查test.lng 语言包
; V3 n* x" \( Y5 `- A3 J0 h. o7 ?> sfe lc test.lng ; 检查和更正test.lng 语言包 @ Z1 {( H* J
/ X4 j5 T' _1 t4 \2 N
提取菜单:
- K. ^: D) I) y% p" V0 y=============
) m1 L8 Z& A6 m; u> sfe m ; 帮助
g) ]- |1 f. |- C# O9 j> sfe m src.bin ; 提取菜单结构和入口
B a+ @& h h* p$ T
' t4 K1 P) N; B1 D" q! W' o; p# z/ Q! t1 _- S- j' L
补丁: L8 f. a9 N! ^
=========, S! g5 R5 \3 L) \4 \# r) B+ t7 c. [
> sfe p ; 帮助
# a* S b/ l) Z% f2 a> sfe p sl45_44.bin patch.txt 44,BCI ; 应用 BCI 补丁,地址为 44zzzz,补丁文件patch.txt,目的文件 sl45_44.bin
% u. f6 r* m4 U$ e; X> sfe p sl45_44.bin p.txt 44,BCI,u ; 取消 BCI 补丁,取消补丁文件为 p.txt, 目的文件为 sl45_44.bin,地址 44zzzz
1 Z* J) @5 D2 |) Q7 q5 {> sfe p binfile.bin p.txt 00,BCI ; 生成 bin 文件 binfile.bin, 从 BCI 补丁文件 p.txt,地址 00zzzz 7 {% |! y( J0 s
+ Z7 `" Q) x: p, n
, u; W5 C( @' l* e( o$ y, Z编译:
8 h6 U% U5 t; _# E' C( j==========
1 s6 _0 q, U5 T. y. h9 \! F> sfe a ; 帮助
. C) n) Q( R) p> sfe a src.asm ; 编译 src.asm: F2 x2 T/ t* f2 R/ p
> sfe a src.asm d ; 编译 src.asm, 完整输出
3 V7 G" x$ b& B( N e# b> sfe a "mov r12, #1234h" ; 单句编译5 g7 `" N7 U1 v' H
> sfe a "mov r2,r1 ; sub r2,#1" ; 多句编译7 \0 P/ X, P& ~: |1 u7 Z
> sfe a src.asm,TST ; src.asm编译成补丁格式
- B$ |( w. a* R* ^> sfe a src.asm,TST p ; src.asm编译成补丁格式$ F! u) L5 S* ^: A! g' C: H) B
> sfe a src.asm,TST p,10 ; src.asm编译成补丁格式,输出10H行* `8 L7 o7 o; `7 R( D$ Y( S, x
> sfe a src.asm,TST p,10,a00000 ; src.asm编译成补丁格式,输出10H行,指定基址 = 0xa00000- b' [/ Q) a! f- n$ q
> sfe a s.asm,TST p,10 org.bin ; src.asm编译成补丁格式,输出10H行,包含 org.bin 的值。
1 o, r8 C' {1 h% F3 J" c
, \: h o5 S; k8 S" I# @2 l5 m*) See Assembler Part to get more 'assembler' function detail( B% v4 k; i( ]* A7 ?
; u: N/ J4 O1 J! }$ V7 S) P' V; e' w7 l. j! C. ]% d# L
反汇编:
9 e* t5 b8 @; }0 m7 _============= Q: C- n/ u5 n @
> sfe d ; 帮助* p4 {3 `3 S1 R' k: F3 Q* l: ?6 `
> sfe d src.bin ; 反汇编 src.bin
/ e- V a0 _4 s. M> sfe d src.bin,200 ; 从 0x200 开始反汇编 src.bin9 g! s: |$ C! w) }- K2 C. Z
> sfe d src.bin,200,100 ; 同上, 但只反汇编 0x100 字节, A! Z6 b4 C0 q7 W+ y" P3 {$ |
> sfe d src.bin,200,100 a00000 ; 同上,指定了基址,输出时将加上 A000001 Z+ B+ Y9 ~2 w4 O: e
> sfe d src.bin,200,101 a00000 ; 同上, 但遇到返回语句将停止, ~1 N3 s3 ^9 R$ Z3 X
> sfe d src.bin,200,101 a00000,p ; 同上,输出时不带地址
& U+ J* @0 Z2 F& \4 U5 ~, L> sfe d t.txt,27e000,101 ; 反汇编 t.txt补丁文件3 J, f' d4 K3 b! [+ o' h7 b0 b# H8 R
> sfe d image.bmp ; 单色图形汇编输出( I; f% t) ~. ~9 N8 l
> sfe d image.bmp,8,8 10,10,img1 ; 同上,从图形中x=8,y=8,w=10,h=10取出。
# Q- P B0 Z: M# b. r% A0 [* m. R7 q# F+ J) @. x
调试:
# k3 |$ l) i. z( g2 y1 k=========( R9 w3 y" I* C9 R
> sfe r ; 帮助5 W9 L0 w- @0 Q3 Z0 U
> sfe r src.bin ; 运行 src.bin4 C- N% z5 m0 P" f" ?9 n; a* @' U
> sfe r src.asm ; 运行 src.asm 汇编文件9 ?" J1 s5 F2 n+ P# Y
> sfe r src.asm ,n ; 同上, 正常输出
- f; o9 W- Q+ A4 G% o6 B5 {> sfe r src.bin,200 ; 从 0x200 地址开始运行9 n, r9 j" M' O8 ^- V
> sfe r src.bin,200,100 ; 运行 0x100 字节, 运行地址 0x200
7 G- y2 X- ^; d: u3 L- W2 r2 w> sfe r src.bin b00000 ; 以 B00000 为基址运行
) ~# I0 g" Y) P: D/ \> sfe r src.bin ,,src.mem ; 加上内存文件 src.mem 一起运行$ \8 e: s2 _. w9 |: \3 ` O& a
> sfe r src.bin ,ri,src.mem ; 同上,用交互方式运行
3 E, T3 U% _4 _) O$ O
# q" b( e- x6 \5 r1 k6 p" g& W! j# e) _3 x4 J$ _
交互调试:
% s% l: k( M5 y! \" M2 u. q======================
+ C( Y) _3 k8 P9 u; j3 G, T+ o! W. n> h ; 帮助6 K9 U# W# Q7 ]" {; t( o! I: A
> g a00000 ; 到地址 a000008 A. h l( D* O9 t+ ]0 A. V( m
> g 37:3800 ; 到地址 37:3800 (37*0x4000+3800 = DF800)1 y k8 P, O$ c, z3 S: i: |: n# u9 f
> d ; dump 内存 (现在地址)5 |" @, b1 h2 c) [
> d a00000 ; dump a00000 开始的内存
, `/ P# ?& `& L ?1 P6 O> d a00000 200 ; dump a00000 开始的内存, 大小 0x200- `" @6 R& \3 v2 ^
> d r ; dump 注册" N- r- H) G. d5 b6 ~
> a ; 单句汇编
1 e& q7 z; b) E6 y> a c7d530 ; 单句汇编地址在 c7d530
. F3 i; U2 Y/ ^5 n5 p> u ; 显示反汇编
) s9 z8 ], V; W2 `+ T2 { A% L2 A> u a00020 ; 显示地址 a00020的反汇编' }. d4 M( h ~0 P& h$ g" q8 b$ ?
> r ; 在现在的地址上执行一条语句
V% O" ?) t. O; l- X" M> r 1 ; 在现在的地址上执行一条语句 (跳过call语句)) S* L+ c- u; o1 F" X/ @, ?
> r 0 ; 运行到返回语句3 Q3 r1 j2 X3 p! u ]& I8 ^
> r -c7d580 ; 运行到地址 c7d5807 L2 g& N1 r( ~/ g( G" h/ z
> q ; 退出
& S# t w. |8 C/ n" f) a: ]3 z
% H0 }# ^" T$ P4 Q! k*) 所有未声明的语句都会改变当前地址。( U* u. u0 F! h0 h {
2 h& ^3 m! [, x5 o% {$ f
& f6 z, U* z: Q0 X特别的助记符:( z; R- G3 b5 j& T
============================; I/ |& F& L2 g4 u4 H3 k
*) 所有C166的汇编格式
3 l6 q+ o! B* c; ?4 C+ k+ x*) 分号用于注释 (在一行的任何地方)
5 e" l! C' e6 j% y5 u*) 特别的助记符如下 :
. c, U" \$ p' e- V$ B/ l #include filename ; 包含文件(各种定义)$ p t% n, d, Z/ B
#define var value ; 设置替代变量 var = value
2 P: _0 c* p& B var equ value ; 变量取值 var = value* K- I) \' w K% V! o
db 'X',36h ; 定义 byte(s) 数据区
7 e7 x* q/ {: L+ o t+ k+ ] dw 1234h,0,'AB' ; 定义 word(s) 数据区
5 K; r) y" P; W7 P6 S$ o org ; 设定当前地址
- k9 n. ^) @" \% p& f base ; 设定基址(补丁的输出将会改变相应地址,当前地址 - 基址)
4 a1 p. a7 K y5 N2 ~5 x end ; 结束记号. G+ `+ k p/ S/ {; \8 K" F* h
;#name XXX.string ; 定义补丁名称 (XXX) o5 y7 N, a' @% l1 ]- y3 e
' ; 注释将一起进入补丁/ M. S. O V9 F: W: t) f$ t5 j
'' ; 注释将一起进入补丁,加回车+ G) D. T7 N" \. Y. I! }9 e
'; ; 以下内容将全部是注释,直到出现 ''0 R! ]3 G: V, ~- ^
;' ; 注释将一起进入补丁5 b- T( Q0 o: {
+ - * / % ; 加, 减, 乘, 除, 求模 操作
; i9 [6 u' S, C( b- ~ >> > < << ; 右移左移操作2 ~' N7 D* M% o- b- o- F: j# T
& && | || ^ ^^ ; 与, 或, 与非操作
6 E4 G* m- Y& V val1:val2 ; 页表示地址 (val = val1 * 0x4000 + val2)
$ L, e2 [" n# h/ l+ t4 P( U4 H/ K page(value), - @* p1 W, f8 z4 M' s
pag(value),6 s( ? T) a: O% c8 S5 q
p(value) ; 页值 (= value / 0x4000)
" l5 T; G0 C% \ pof(value), U& x5 B/ E1 t1 T* z d
q(value) ; 页偏移值 (= value mod 0x4000)
" P. `( D8 {4 ^# ? segment(value),% k' O/ X& }8 e; I# z# |. Y& T K& n
seg(value),3 ^/ F5 t: I7 g. w
s(value) ; 段值 (= value div 0xFFFF)
& a$ V5 y/ o9 Q( K* o. k" n offset(value),
# S0 ~% y6 ~/ L ofs(value),
M; C! F6 `+ H4 E9 M5 j! W$ {8 T sof(value),! q& S- h( X4 O, ^ ^
o(value) ; 段偏移值 (= value mod 0xFFFF)7 i- F4 p/ C! x/ q% w2 D" h9 O
, t0 q. Y* A5 C* L, r
*) 例子:
3 |( z' X6 y9 E0 J7 |" s9 g8 W6 ]! Q7 |/ m' E; B
;--- Testing ---7 s& V" a3 z; S% F0 i
; n6 I/ {* A o/ h \7 [. bbase 0A00000h ; 自动转换文件地址为 SL45 内存地址
" R0 a, l( E7 g4 o
" j. \" Z: u9 |2 |#ifdef ME45. `9 u$ }; T2 o, y) W( |4 ^
#include me45.inc
/ N& c9 E% I3 @ R J; h9 t#else) r* K4 D) _9 ?" ]
#include sl45.inc
3 b) f. Q0 ^! Z! |+ i3 O q #define FreeRAM 37h:3600h5 ?8 C8 x, {1 x
#define memcpy 0c7b384h
% E% a0 L! v/ E- _1 s#endif5 Z0 W* O8 {! Z3 c; }( ^
$ J$ L. h3 o6 V2 t" ~6 ~5 b9 q' d! M;#name TST. Test Patch ; 补丁名* d* V2 N) \9 [* `
4 o: i/ `* M2 ?- e# \9 M'Firmware : sl45v56- s0 l( w8 m- a1 O6 P
'Author : rizapn
$ q# q, F. j; A7 m9 U/ ?2 s3 x% Z'Updated : Aug 18, 20042 b5 O1 M/ ?; z& t: V( W6 q
, ^& G/ a/ |* E1 c. ?org 0c7e000h/ {; w4 K" a h( G7 b+ _
mov r12, #q(FreeRAM) ; 得到 FreeRAM 页偏移2 x% G( B3 f( U4 }0 \" D! N" ~
mov r13, #p(FreeRAM) ; 得到 FreeRAM 页值" b+ M* F0 X5 O5 d/ R, d
extp #p(data2), #1 ; 跳到 data2 页1 V3 ?5 O7 T: n% A( i6 L
movb rh4, q(data2)+1 ; 得到 data2+#1h 地址的值(为 10h). b# |' _+ `% i' ^$ E+ g/ A o
callr sub_1 ; 页内调用& v; t6 B4 ]6 y+ e/ T
movb rl2, #'A' ; 得到 ASCII 码 'A'
# _2 n, A8 J8 H7 y6 s M* h3 jloop_1:- q B) M7 G9 b9 a2 |/ u5 z
mov r2, #1234h
5 W+ y2 `( l# ]$ N mov [-r0], r2; ~) n( V& h% m% z4 q
calls memcpy ; 调用段表示的子程序0 p+ t( W* V3 Q
add r0, #2% U- T: b4 G) x- C+ B. G. p
jmpr cc_NZ, loop_1 ; 跳到 loop_1 标号处
9 \ b# e I9 ^" {( J" X rets
" l0 x2 _7 R: w2 E9 E( ~7 r/ m# f) W( \4 [' X: M
sub_1:; Y% l6 x+ @4 Y# ~" S
mov r4, #1234h
4 @6 P* v7 S, M2 ?% X ret
& k; m0 M0 w+ w( x4 P: T
5 }& Q0 {5 P$ h& M! D! _7 Rdata2:
) d0 p5 O( e ^8 B, `4 e db 'A',10h,'Testing',0 ; 定义 bytes 型数据区
" y3 A7 g& V7 m @) w7 G7 U7 o! I# P' l, X1 j C. m
end/ v8 `3 J. T% ~) b0 D
' f/ o$ C5 ~3 Q5 n
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~) S* c( M) D$ f9 y' H/ U7 ~- W
! @: ]* W) D* i) Q' F( eAllaahu Akbar,
% S; \ Y9 B+ I* ]( x" z, a' |RizaPN <rizapn@yahoo.com>9 p7 j/ J L0 o/ |$ N
Jakarta - Indonesia' m' f1 E! @6 Q; r/ P. E
' W5 I Y! ^* l+ C. ]9 ~
[ 本帖最后由 wwssff 于 2005-11-9 12:22 编辑 ] |
|