马上注册,结交更多好友,享用更多功能,让你轻松玩转闽南师范大学。
您需要 登录 才可以下载或查看,没有账号?立即加入
×
<b>Debug:A(汇编)</b>. m! B" \& x2 S' J& ^
3 ^1 a; r& l' S/ k& f1 _) E直接将 8086/8087/8088 记忆码合并到内存。 . w( b: P' b# p: M. l
该命令从汇编语言语句创建可执行的机器码。所有数值都是十六进制格式,必须按一到四个字符输入这些数值。在引用的操作代码(操作码)前指定前缀记忆码。 6 n7 v( J0 ?4 o2 n" Y" J0 G/ e+ H$ L
a [address]
* c" b1 y- K" T: V- o* [参数
' H, X2 e* {; z, d( ~# o8 G; Zaddress
% F0 }) H, Q6 h6 P指定键入汇编语言指令的位置。对 address 使用十六进制值,并键入不以“h”字符结尾的每个值。如果不指定地址,a 将在它上次停止处开始汇编。
# S9 w% k# g( {. [/ M5 w8 r, `有关将数据输入到指定字节中的信息,请参看Debug E(键入)。
* \( v4 v* E1 n! t! z有关反汇编字节的信息,请参看Debug U(反汇编) 2 v$ ?" c( M1 n# y- d- e! g4 q
说明 5 l3 c# }( R8 `" t6 y) S
使用记忆码
, k6 g$ O: k$ n* b2 V6 O段的替代记忆码为 cs:、ds:、es: 和 ss:。远程返回的记忆码是 retf。字符串处理的记忆码必须明确声明字符串大小。例如,使用 movsw 可以移动 16 位的字串,使用 movsb 可以移动 8 位字节串。 8 i* O% H2 V3 P& J: W/ ]5 ^
汇编跳转和调用
7 u1 o" s. u2 r" d9 M0 t1 y汇编程序根据字节替换自动将短、近和远的跳转及调用汇编到目标地址。通过使用 near 或 far 前缀可以替代这样的跳转或调用,如下例所示: ' m* b, a) K7 D, S6 o
-a0100:0500
/ Q9 {) b5 f; l/ N& g0100:0500 jmp 502 ; a 2-byte short jump
, i8 o2 C! Q' L% F7 s) c0100:0502 jmp near 505 ; a 3-byte near jump
) d X$ ~. Z, H( P& _* b0100:0505 jmp far <st1:chmetcnv w:st="on" TCSC="0" NumberType="1" Negative="False" HasSpace="False" SourceValue="50" UnitName="a">50a</st1:chmetcnv> ; a 5-byte far jump 6 i* |* S& a2 Q
可以将 near 前缀缩写为 ne。
# N" ^8 M# P1 f3 d/ x# d- {区分字和字节内存位置
% w1 s D# a; u: K当某个操作数可以引用某个字内存位置或者字节内存位置时,必须用前缀 word ptr 或者前缀 byte ptr 指定数据类型。可接受的缩写分别是 wo 和 by。以下范例显示两种格式: % s+ w* b/ C& |- m8 E
dec wo [si] 3 q. Z+ E7 z [1 E) [5 `
neg byte ptr [128]
4 h! b+ y( d6 T. g. L0 e, l: C指定操作数 ; J0 G' ^# l9 t
Debug 使用包括在中括号 ([ ]) 的操作数引用内存地址的习惯用法。这是因为另一方面 Debug 不能区分立即操作数和内存地址的操作数。以下范例显示两种格式:
2 j8 }$ M8 Z6 J# N: Hmov ax,21 ; load AX with 21h 5 c" ~/ z$ i5 k# H. ]
mov ax,[21] ; load AX with the
/ C6 p1 p- v0 L* o; contents of
. T/ ]3 f9 h3 ^4 h; memory location 21h 6 Q$ Y" _# \8 ^' d7 b! _
使用伪指令 , ^# I- `, f% M5 K* z& ]/ Q6 P
使用 a 命令提供两个常用的伪指令:db 操作码,将字节值直接汇编到内存,dw 操作码,将字值直接汇编到内存。以下是两个伪指令的范例: 7 Z5 B Y9 a) b% ^! \
db 1,2,3,4,"THIS IS AN EXAMPLE" # ^! ^& ~4 M# r: t7 R: `' l
db 'THIS IS A QUOTATION MARK:"'
" B; a7 a0 `. |: H! ?" Udb "THIS IS A QUOTATION MARK:'"
/ V) r8 d- y( V: ]0 tdw 1000,2000,3000,"BACH" & t. d) [+ h; U
范例 g0 B* `3 R* F7 L" }3 O( T
a 命令支持所有形式的间接注册命令,如下例所示: ! n/ ]: }, u$ C3 V5 s- j% f a
add bx,34[bp+2].[si-1] 5 Z) \9 ?) C% t, b
pop [bp+di] 6 W1 s% O; o. z W/ X$ n. T& |3 c9 T
push [si] )
+ l3 \5 n5 u, I6 ~9 w. r还支持所有操作码同义词,如下例所示:
4 L( D; u7 |& \3 h' B2 f, Kloopz 100 2 }9 }6 {* W8 F7 i \: O
loope 100
+ r0 A/ m/ c8 j/ L4 Dja 200
# b8 P! N4 ?9 R1 b7 w( @jnbe 200 + |6 d$ |$ e8 Z; O
对于 8087 操作码,必须指定 wait 或 fwait 前缀,如下例所示: ; w e% U; b, d$ U$ @3 k
fwait fadd st,st(3) ; this line assembles 4 s! i$ P! h3 ~( W0 z* F2 L7 B# B; p
; an fwait prefix |