var dword 12345678h
现以字节为单位按地址从低到高的顺序,写出这个变量内容。并说明如下指令的执行结果:
mov eax,var mov bx,var mov cx,var+2 mov dl,var mov dh,var+3
; EAX=__________ ; BX=__________ ; CX=__________ ; DL=__________ ; DH=__________
可以编程使用十六进制字节显示子程序DSIPHB顺序显示各个字节进行验证,还可以使用十六进制双字显示子程序DSIPHD显示该数据进行对比。 〔解答〕
小端方式采用“低对低、高对高”,即低字节数据存放在低地址存储单元、高字节数据存放在高地址存储单元。以字节为单位按地址从低到高的顺序,var变量的内容:78H、56H、34H、12H。
; EAX=12345678H ; BX=5678H ; CX=1234H ; DL=78H ; DH=12H
〔习题3.16〕
使用若干MOV指令实现交互指令“XCHG EBX,[EDI]”功能。 〔解答〕
push eax mov eax,ebx mov ebx,[edi] mov [edi],eax pop eax
; 可以没有
; 可以没有
〔习题3.17〕
假设当前ESP=0012FFB0H,说明下面每条指令后,ESP等于多少?
push eax push dx
push dword ptr 0f79h pop eax
pop word ptr [bx] pop ebx
〔解答〕
ESP=0012FFACH ESP=0012FFAAH ESP=0012FFA6H ESP=0012FFAAH ESP=0012FFACH ESP=0012FFB0H 〔习题3.18〕
已知数字0~9对应的格雷码依次为:18H、34H、05H、06H、09H、0AH、0CH、11H、12H、14H;请为如下程序的每条指令加上注释,说明每条指令的功能和执行结果。
- -13
table ; 数据段
byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h ; 代码段
mov ebx,offset table mov al,8 xlat
为了验证你的判断,不妨使用本书的I/O子程序库提供的子程序DISPHB显示换码后AL的值。如果不使用XLAT指令,应如何修改? 〔解答〕
table
; 数据段
byte 18h,34h,05h,06h,09h,0ah,0ch,11h,12h,14h ; 定义格雷码表 ; 代码段
mov ebx,offset table ; EBX=格雷码表首地址 mov al,8 ; AL=8 xlat ; AL=12H(8的格雷码) mov ebx,offset table mov eax,0 mov al,8 mov al,[eax+ebx]
; EBX=格雷码表首地址 ; AL=8
; AL=12H(8的格雷码)
不使用XLAT指令:
〔习题3.19〕
请分别用一条汇编语言指令完成如下功能:
(1)把EBX寄存器和EDX寄存器的内容相加,结果存入EDX寄存器。
(2)用寄存器EBX和ESI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
(3)用EBX和位移量0B2H的寄存器相对寻址方式把存储器中的一个双字和ECX寄存器的内容相加,并把结果送回存储器中。
(4)将32位变量VARD与数3412H相加,并把结果送回该存储单元中。 (5)把数0A0H与EAX寄存器的内容相加,并把结果送回EAX中。 〔解答〕
① add edx,ebx
② add al,[ebx+esi] ③ add [bx+0b2h],cx ④ add varw,3412h ⑤ add eax,0a0h
〔习题3.20〕
分别执行如下程序片断,说明每条指令的执行结果:
(
〔解答〕
(1)
; EAX=80H
; EAX=83H,CF=0,SF=0 ; EAX=103H,CF=0,OF=0 ; EAX=106H,CF=0,ZF=0
(2)
; EAX=100
- -14
; EAX=300,CF=0
(3)
; EAX=100
; EAX=44,CF=1(包含256的进位含义:256+44=300)
(4)
mov al,7fh sub al,8 sub al,80h sbb al,3
; AL=7FH
; AL=77H,CF=0,SF=0 ; AL=F7H,CF=1,OF=1 ; AL=F3H,CF=0,ZF=0
〔习题3.21〕
给出下列各条指令执行后AL值,以及CF、ZF、SF、OF和PF的状态:
mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al mov al,89h add al,al add al,9dh cmp al,0bch sub al,al dec al inc al
; AL=89H ; AL=12H ; AL=0AFH ; AL=0AFH ; AL=00H ; AL=0FFH ; AL=00H
CF ZF 1 0 0 0 1 0 0 1 0 0 0 1
SF 0 1 1 0 1 0
OF 1 0 0 0 0 0
PF 1 1 1 1 1 1
〔解答〕
〔习题3.22〕
有两个64位无符号整数存放在变量buffer1和buffer2中,定义数据、编写代码完成EDX.EAX←buffer1-buffer2功能。 〔解答〕
buffer1 buffer2
; 数据段
qword 67883000h qword 67762000h ; 代码段
mov eax,dword ptr buffer1 mov edx,dword ptr buffer1+4 sub eax,dword ptr buffer2 sbb edx,dword ptr buffer2+4
〔习题3.23〕
分别执行如下程序片断,说明每条指令的执行结果: 〔解答〕
(1)
; ESI=9CH ; ESI=80H ; ESI=FFH ; ESI=01H
- -15
(2)
; EAX=1010B(可以有前导0,下同) ; EAX=0010B,CF=1 ; EAX=0100B,CF=0 ; EAX=0000B,CF=0
(3)
; EAX=1011B(可以有前导0,下同) ; EAX=101100B,CF=0 ; EAX=10110B,CF=0 ; EAX=10111B,CF=0
(4)
; EAX=0,CF=0,OF=0 ; ZF=1,SF=0,PF=1
〔习题3.24〕
3.24 给出下列各条指令执行后AX的结果,以及状态标志CF、OF、SF、ZF、PF的状态。
mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax
test ax,0f0f0h mov ax,1470h and ax,ax or ax,ax xor ax,ax not ax
test ax,0f0f0h
; AX=1470H ; AX=1470H ; AX=1470H ; AX=0000H ; AX=FFFFH ; AX=0F0F0H
CF OF 0 0 0 0 0 0 0 0 0 0
SF 0 0 0 0 1
ZF 0 0 1 1 0
PF 0 0 1 1 1
〔解答〕
〔习题3.25〕
逻辑运算指令怎么实现复位、置位和求反功能? 〔解答〕
AND指令同“0”与实现复位,OR指令同“1”或实现置位,XOR同“1”异或实现求反。 〔习题3.26〕
说明如下程序段的功能:
next:
mov ecx,16 mov bx,ax shr ax,1 rcr edx,1 shr bx,1 rcr edx,1 loop next mov eax,edx
〔解答〕
将AX的每一位依次重复一次,所得的32位结果保存于EAX中。
- -16