《x86汇编语言:从实模式到保护模式》检测点和习题答案

第一部分

作者提供了部分答案

检测点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

扫描二维码关注公众号,回复: 11187547 查看本文章

检测点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

原创文章 182 获赞 29 访问量 2万+

猜你喜欢

转载自blog.csdn.net/treblez/article/details/105933671