第一部分
检测点1.1:按顺序分别为:13 15 78 255 128 56091
检测点1.2:按顺序分别为:1000 1010 1100 1111 11001 1000000 1100100 11111111 1111101000 1111111111111111 100000000000000000000
检测点1.3:按顺序分别为:8 10 11 12 13 14 15 16 31 1741 1022 4092 65535
检测点1.4:按顺序分别为:8 a c f 19 40 64 ff 3e8 ffff 100000
检测点1.5:1.按顺序分别为:11 1010 1100 1111 100000 111111 1011111110 1111111111111111 100111111100000001011101 1111100110011111111111011111111
2.按顺序分别为:1/1 11/3 0101/5 111/7 1001/9 1011/A 1101/D 1111/F 0/0 10/2 100/4 110/6 1000/8 1100/C 1110/E
检测点1.6:1.4092/111111111100 2.27B6100/10011110110110000100000000
第1章习题:1.5 C =15D=1111B =12D=1100B =10D=1010B =8H=1000B =11D=1011B =14D=1110B =16D=10000B 2.12 10101 10001111 1000000000 1FF
检测点2.1:1.(2) (16) (4) (32) 2. (7) (8) 最高位 3. (00) (0F) (8) (00、02、04、06、08、0A、0C、0E) 双字时,是00、04、08、0C
检测点2.2:A3D8H
检测点2.3:1.8 (AX BX CX DX SI DI BP SP) (AH AL BH BL CH CL DH DL) 2.(A) © (D F) 3.(A B C D F)
第2章习题:1. 64个 2. 25BC0H~35BBFH
检测点3.1:1.(略) 2. (B) (A) ©
第3章习题:1. 00H、35H、40H 2. 49H(即73个字节)
检测点4.1:1.(0) (0) (1) (0) (0) (1) 2. (A B C)
检测点4.2:1.(略) 2. (略) 3.应在屏幕克上角显示a、s、m三个字母
检测点5.1:1.(0xB8000) (0xB800) (0xF9E) (0x27) (0x48) 2. (E F G H J L) A错误的原因是企图向8位寄存器传送16位字; B错误的原因是向段寄存器传送立即数; C错误的原因是通过8位寄存器AL向段寄存器传送; D错误的原因是未指示内存操作数的长度; I错误的原因是两个寄存器不匹配; K错误的原因是在两个内存单元之间传送。
检测点5.2:db一行不该出现0xf000
检测点6.3:0xf0 0xff 0x81 0xffff 0x8a08
检测点6.4:
1:
当ZF=(1),时,表明计算结果为零; jz指令的意思是当ZF=(1)时,即计算结果为0时转移; je指令的意思是当ZF=(1)时,即计算结果为0时转移; jnz指令的意思是当ZF=(0)时,即计算结果不为(0)时转移; jne指令的意思是当ZF=(0)时,即计算结果不为(0)时转移; 2:
cmp ax,bx
ja lbb
je lbz
jb lbl
第1章习题:
检测点12.2: 当前栈段描述符的B位是1,基地址为0x00700000,界限值为0xFFFFE。那么,在32位模式下,该栈段的有效地址范围是0x00700000~( )。当ESP的内容为0XFFFFF002时,还能压入一个双字吗?为什么? 如书中所说,当栈段描述符的B位为1时,段界限是以4KB位单位的,因此,此时实际使用的段界限值是0xFFFFE*0x1000+0xFFF=0xFFFFEFFF,再根据实际使用的段界限+1≤( ESP 的内容-操作数的长度)≤0xFFFFFFFF
可以得到ESP的范围为0xFFFFEFFF+1<=ESP<=0xFFFFFFFF,即0XFFFFF000<=ESP<=0XFFFFFFFF,用题目中所给出的栈段基地址0x007C0000加上ESP所允许的最小和最大偏移量,即可得栈段的最低端地址是0x007C0000+0xFFFFF000=0x007BF000,最高端地址为0x007C0000+0xFFFFFFFF=0x007BFFFF,即题目中的栈段有效地址范围为0x007BF000~0x007BFFFF。当ESP的内容为0XFFFFF002时,对应的物理地址为0x007C0000+0xFFFFF002=0x007BF002,压入一个双字时,ESP-4=0xFFFFF002-4=0XFFFFEFFE,对应的物理地址为0x007C0000+0xFFFFEFFE=0x007BEFFE,由于该地址在栈段的最低端地址以下,所以是不能压入一个双字的。
第二部分
笔者自己补充的,如有错误,敬请指正
第七章
7.1 1111111111110000
解析:
初始值
ax:1111111111110000
[data]:0101010110101010
and操作后:
ax:1111111111110000
[data]:0101010110100000
or操作后:
ax:1111111111110000
[data]:0101010110100000
7.2 AC
解析:
入栈的操作是先将 sp减2 再以 ss:sp 为地址存放数据
7.3
完整程序如下:
push ds
push bx
push ax
mov bx,ss
mov ds,bx
mov si,sp
mov dx,[ds:si]
pop ax
pop bx
pop ds
本章习题
1
xor ax,ax
mov cx,100
@f:
add ax,cx
loop @f
;实现1-1000的累加和
;文件说明:硬盘主引导扇区代码
;创建日期:2013-5-4 21:31
jmp near start
message db '1+2+3+...+1000='
start:
mov ax,0x7c0 ;设置数据段的段基地址
mov ds,ax
mov ax,0xb800 ;设置附加段基址到显示缓冲区
mov es,ax
;以下显示字符串
mov si,message
mov di,0
mov cx,start-message
@g:
mov al,[si]
mov [es:di],al
inc di
mov byte [es:di],0x07
inc di
inc si
loop @g
;以下计算1到1000和
xor ax,ax
xor dx,dx
mov cx,1000
@f:
add ax,cx
adc dx,0
loop @f
;以下计算累加和的每个数位
xor cx,cx ;设置堆栈段的段基地址
mov ss,cx
mov sp,cx
mov bx,10
xor cx,cx
inc cx
div bx
or dl,0x30
push dx
@d:
inc cx
xor dx,dx
div bx
or dl,0x30
push dx
cmp ax,0
jne @d
;以下显示各个数位
@a:
pop dx
mov [es:di],dl
inc di
mov byte [es:di],0x07
inc di
loop @a
jmp near $
times 510-($-$$) db 0
db 0x55,0xaa
第八章
8.1
1)0
2)0xC0
解析:data1到data3一共2+2+2=6字节,因此地址是0xC0
3)f055
4)0xf000
5)0xfff0
8.2
1)call label_proc
2)call bx
3)call [bx]
4)call 0xf000:0x0002
5)call far [0x80]
6)call far [bx+di+0x08]
8.3
1) 0001010101101010
2)
jmp label_proc
jmp bx
jmp [bx]
jmp 0xf000:0x0002
jmp far [0x80]
jmp far [bx+di+0x08]
第十一章
11.1
1)
0x004F9AFFFFFFFFFF
低32位:
1111 1111 1111 1111 1111 1111 1111 1111
高32位:
0000 0000 0100 1111 1001 1010 1111 1111
段基地址:
00000000111111111111111111111111
也就是0xffffff
段界限:
1111 1111 1111 1111 1111 1111
也就是0xffffff
G:0
D:0
L:0
AVL:0
P:1
DPL:00
S:1
TYPE:1010
2)
低32位0xCOF001FF,高32位0x00C0922F。
11.2
1)因为32位cpu中,一个字是四个字节
所以是
[0×00409800]
[0x1047c766]
2)BD