搜档网
当前位置:搜档网 › x86汇编语言:从实模式到保护模式勘误表

x86汇编语言:从实模式到保护模式勘误表

x86汇编语言:从实模式到保护模式勘误表
x86汇编语言:从实模式到保护模式勘误表

1,第42页,检测点,第1题。本程序有误,正确的内容是:(由网易邮箱读者'小小鸟'、QQ 读者'闪耀'、'流星梦'和'二玉'发现)

mov ax,0xb800

mov ds,ax

mov byte [0x00],'a'

mov byte [0x02],'s'

mov byte [0x04],'m'

jmp $

times 510-($-$$) db 0

db 0x55,0xaa

2,第52页,第24行,正确的内容是:(由QQ读者'闪耀'发现)

mov ax,[0x02] ;按字操作

3,第53页,第4行,正确的内容是:(由QQ读者'tome'发现)

mov [0x02],bl

4,第65、80、94、129、138页中,需要更正和明确loop指令、短转移指令jmp short、相对近转移指令jmp near和相对近调用指令call near的操作数计算方法和执行过程。(由网易邮箱读者'小小鸟'、QQ读者'艾小羊'提出)

首先,这些指令的操作数都是相对于目标位置处的偏移量。但需要指出的是,偏移量的计算方法取决于实际的编译器,书中所说的“用目标位置处的汇编地址减去当前指令的汇编地址,再减去当前指令的长度”,不应算错。

其次,处理器的执行过程严格地说,是非IA-32架构的组成部分。因此,除了结果是确定的,各步骤的先后次序取决于处理器的设计。历史上,指令的执行过程有不同的解释和说法。但本书对这些指令执行过程的解释比较模糊和武断。为严谨起见,再统一描述如下:在以上指令的编译阶段,编译器用目标位置处的汇编地址减去当前指令的下一条指令的汇编地址,结果做为操作数;处理器在执行一条指令时,指令指针寄存器IP会自动指向下一条指令。因此,当以上指令执行时,IP的内容就是下一条指令的偏移地址。处理器用IP的内容加上指令的操作数(如果是call near指令,还要压入IP的内容),并用该值取代IP中的原有内容。

5,第79页,检测点。正确的内容是:(由QQ读者'闪耀'发现)

选择填空:MOVSB指令每次传送一个(),MOVSW指令每次……

6,第86页,第26行:(由QQ读者'闪耀'发现)

原指令为“idiv bl”,正确的是“idiv bx”

7,第92页,检测点,第2题,(由QQ读者'闪耀'发现)

中间一句的正确内容是:“AX的内容等于BX的内容时,转移到标号lbz处执行;”8,第101页,节。本节第10行:(由QQ读者'闪耀'发现)

正确的内容是:“……为了方便,源程序第50行,直接将DL中的余数……。”

9,第104页,节。本节第12行。(由QQ读者'闪耀'发现)

正确的内容是:mov ax,cs

10,第136页,倒数第11行。(由QQ读者'闪耀'发现)

正确的内容是:第四种指令格式和第三种类似,只是……

11,第137页,倒数第14行。(由QQ读者'tome发现)

正确的内容是:如图8-15所示。

12,第144页,小节内第2行。

少了一个字。应当是“为此,需要首先识别出它们。”

13,第152页,倒数第3行。(由QQ读者'闪耀'发现)

应改为“那么它每个引脚IR0~IR7所对应的中断号分别为0x08~0x0F。”

14,第155页,图9-4。(由QQ读者'艾小羊'提出)

改为下图:

第4章指令系统层习题参考解答-汇编语言与计算机组成原理 答案

1.什么是“程序可见”的寄存器? 程序可见寄存器是指在用户程序中用到的寄存器,它们由指令来指定。 2. 80x86微处理器的基本结构寄存器组包括那些寄存器?各有何用途? 基本结构寄存器组按用途分为通用寄存器、专用寄存器和段寄存器3类。 通用寄存器存放操作数或用作地址指针;专用寄存器有EIP和EFLAGS,分别存放将要执行的下一条指令的偏移地址和条件码标志、控制标志和系统标志;段寄存器存放段基址或段选择子。 3.80x86微处理器标志寄存器中各标志位有什么意义? 常用的7位: CF进位标志: 在进行算术运算时,如最高位(对字操作是第15位,对字节操作是第7位)产生进位或借位时,则CF置1;否则置0。在移位类指令中,CF用来存放移出的代码(0或1)。 PF奇偶标志: 为机器中传送信息时可能产生的代码出错情况提供检验条件。 当操作结果的最低位字节中1的个数为偶数时置1,否则置0。 AF辅助进位标志: 在进行算术运算时,如低字节中低4位(第3位向第4位)产生进位或借位时,则AF置1;否则AF置0。 ZF零标志:如指令执行结果各位全为0时,则ZF置1;否则ZF置0。 SF符号标志:其值等于运算结果的最高位。 如果把指令执行结果看作带符号数,就是结果为负,SF置1;结果为正,SF置0。 OF溢出标志: 将参加算术运算的数看作带符号数,如运算结果超出补码表示数的范围N,即溢出时,则OF置1;否则OF置0。 DF方向标志: 用于串处理指令中控制处理信息的方向。 当DF位为1时,每次操作后使变址寄存器SI和DI减小;当DF位为0时,则使SI和DI增大,使串处理从低地址向高地址方向处理。 4.画出示意图,简述实模式下存储器寻址的过程。 20位物理地址如下计算(CPU中自动完成):10H×段基址+偏移地址=物理地址 5. 画出示意图,简述保护模式下(无分页机制)存储器寻址的过程。 采用对用户程序透明的机制由选择子从描述子表中选择相应的描述子,得到欲访问段的段基址、段限等有关信息,再根据偏移地址访问目标存储单元。

汇编语言大作业

辽宁师范大学计算机与信息技术学院综合性实验报告 课程名称:汇编语言 实验题目:菜单程序设计 学生姓名:孙蕾 专业:计算机科学与技术 学号:20101118050005 实验日期: 2012.5.10 实验成绩:

一、实验目的 设计菜单程序,实现各种功能,设计分支程序,重键盘输入字符。二、实验内容 (1)参考示例5-8设计菜单程序,包含示例5-2、示例5-3及退出三个菜单项。将示例5-2改为从键盘输入X;示例5-3增加显示功能,显示出统计个数。(P120、P101、P106) (2)选作:参考P213第9章示例9-3,在屏幕上清屏、开窗口,将菜单程序带颜色地显示在窗口中。提示:可利用P223宏库9-4.mac中的功能。 三、实验过程(含结果抓图) 1.输入程序代码 data segment x dw ? y dw ? cc db 0ah,0dh,'Y=$' mess0 db 0ah,0dh,0dh,'****************MENU******************' db 0ah,0dh, '*1. calculate Y=5X-18: *' db 0ah,0dh, '*2. count the numbers of a string: *' db 0ah,0dh, '*3. exit *' db 0ah,0dh, '*^^ please select... *' db 0ah,0dh, '**************************************' db 0ah,0dh,' $' mess1 db 0ah,0dh,0dh,'please input a string :$' c db 0ah,0dh,0dh,'please input a number :$' mess2 db 0ah,0dh,'numb:$' mess3 db 0ah,0dh,'capi:$' mess4 db 0ah,0dh,'lett:$' mess5 db 0ah,0dh,0dh,'thank you for using!!$' numb db 10 dup(?) capi db 10 dup(?) lett db 10 dup(?) data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax let0:mov dx,offset mess0 mov ah,9 int 21h

保护模式与实模式

什么是实模式、保护模式和虚拟8086方式 1:实模式:寻址采用和8086相同的16位段和偏移量,最大寻址空间1MB,最大分段64KB。可以使用32位指令。32位的x86 CPU用做高速的8086。 2:保护模式:寻址采用32位段和偏移量,最大寻址空间4GB,最大分段4GB (Pentium Pre及以后为64GB)。在保护模式下CPU可以进入虚拟8086方式,这是在保护模式下的实模式程序运行环境。 第一:实模式下程序的运行回顾. 程序运行的实质是什么?其实很简单,就是指令的执行,显然CPU 是指令得以执行的硬件保障,那么CPU如何知道指令在什么地方呢? 对了,80x86系列是使用CS寄存器配合IP寄存器来通知CPU指令在内存 中的位置. 程序指令在执行过程中一般还需要有各种数据,80x86系列有DS、 ES、FS、GS、SS等用于指示不同用途的数据段在内存中的位置。 程序可能需要调用系统的服务子程序,80x86系列使用中断机制 来实现系统服务。 总的来说,这些就是实模式下一个程序运行所需的主要内容 (其它如跳转、返回、端口操作等相对来说比较次要。) 第二:保护模式---从程序运行说起 无论实模式还是保护模式,根本的问题还是程序如何在其中运行。 因此我们在学习保护模式时应该时刻围绕这个问题来思考。 和实模式下一样,保护模式下程序运行的实质仍是“CPU执行指令, 操作相关数据”,因此实模式下的各种代码段、数据段、堆栈段、中 断服务程序仍然存在,且功能、作用不变。 那么保护模式下最大的变化是什么呢?答案可能因人而异,我的 答案是“地址转换方式”变化最大。 第三:地址转换方式比较 先看一下实模式下的地址转换方式,假设我们在ES中存入0x1000, DI中存入0xFFFF,那么ES:DI=0x1000*0x10+0xFFFF=0x1FFFF,这就是众 所周知的“左移4位加偏移”。 那么如果在保护模式下呢?假设上面的数据不变ES=0x1000, DI=0xFFFF,现在ES:DI等于什么呢? 公式如下:(注:0x1000=1000000000000b= 10 0000 0000 0 00) ES:DI=全局描述符表中第0x200项描述符给出的段基址+0xFFFF 现在比较一下,好象是不一样。再仔细看看,又好象没什么区别! 为什么说没什么区别,因为我的想法是,既然ES中的内容都不是 真正的段地址,凭什么实模式下称ES为“段寄存器”,而到了保护模式 就说是“选择子”? 其实它们都是一种映射,只是映射规则不同而已:在实模式下这

实模式和保护模式的区别

实模式和保护模式的区别 实模式和保护模式的区别 2009-08-31 20:19 551人阅读评论(1) 收藏举报 从80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式(所以存在一个启动时的模式转换问题)。 实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。 在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务切换和保护任务环境; 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离; 支持虚拟8086方式,便于执行8086程序。 1.虚拟8086模式是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位程序。它不是一个真正的CPU模式,还属于保护模式。 2.保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。 实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。至此,进程(这时我们可以称程序为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有: SIGSEGV (linux 段错误);非法内存访问对话框(windows 对话框)。 CPU启动环境为16位实模式,之后可以切换到保护模式。但从保护模式无法切换回实模式

汇编语言课后习题答案

2.1已知DS=2000H、BX=0100H、SI=0002H,存储单元[20100H]~[20103H]依次存放12345678H,[21200H]~[21203H]依次存放2A4C B765H,说明下列每条指令执行完后AX寄存器的内容。 (1)mov ax,1200h (2)mov ax,bx (3)mov ax,[1200h] (4)mov ax,[bx] (5)mov ax,[bx+1100h] (6)mov ax,[bx+si] (7)mov ax,[bx][si+1100h] 〔解答〕 (1)AX=1200H (2)AX=0100H (3)AX=4C2AH;偏移地址=bx=0100h (4)AX=3412H;偏移地址=bx=0100h (5)AX=4C2AH;偏移地址=bx+1100h=1200h (6)AX=7856H;偏移地址=bx+si=0100h+0002h=0102h (7)AX=65B7H;偏移地址=bx+si+1100h=0100h+0002h+1100h=1202h 〔习题2.2〕指出下列指令的错误 (1)mov cx,dl (2)mov ip,ax (3)mov es,1234h (4)mov es,ds (5)mov al,300 (6)mov[sp],ax (7)mov ax,bx+di

(8)mov20h,ah 〔解答〕 (1)两操作数类型不匹配 (2)IP指令指针禁止用户访问 (3)立即数不允许传给段寄存器 (4)段寄存器之间不允许传送 (5)两操作数类型不匹配 (6)目的操作数应为[SI] (7)源操作数应为[BX+DI] (8)立即数不能作目的操作数 〔习题2.5〕已知SS=2200H、SP=00B0H,画图说明执行下面指令序列时,堆栈区和SP的内容如何变化?mov ax,8057h push ax mov ax,0f79h push ax pop bx pop[bx] 〔解答〕 mov ax,8057h push ax mov ax,0f79h push ax pop bx;bx=0f79h pop[bx];DS:[0f79h]=8057h

保护模式下寻址(易懂)

保护模式下寻址(易懂) 保护模式下寻址(易懂):网上看到的一强帖,不转不行了,牛人啊,把这段代码拿捏的相当到位括号中是我的加注段机制轻松体验[内存寻址]实模式下的内存寻址:让我们首先来回顾实模式下的寻址方式段首地址×16+偏 移量=物理地址为什么要×16?因为在8086CPU中,地址线是20位,但寄存器是16位的,最高寻址64KB,它无法寻址到1M内存。于是,Intel设计了这种寻址方式,先缩小4位成16位放入到段寄存器,用到时候,再将其扩大到20位,这也造成了段的首地址必须是16的倍数的限制。保护模式下分段机制的内存寻址:保护模式下分段机制是利用一个称作段选择符的偏移量,从而到描述符表找到需要的段描述符,而这个段描述符中就存放着真正的段的物理首地址,再加上偏移量一段话,出现了三个新名词:1、段选择子2、描述符表3、段描述符我们现在可以这样来理解这段话:有一个结构体类型,它有三个成员变量:段物理首地址段界限段属性内存中,维护一个该结构体类型的是一个数组。而分段机制就是利用一个索引,找到该数组对应的结构体,从而得到段的物理首地址,然后加上偏移量,得到真正的物理地址。公式:xxxx:yyyyyyyy其中,xxxx也就是索引,yyyyyyyy是偏移量(因为32位寄存器,所以8个

16进制)xxxx存放在段寄存器中。现在,我们来到过来分析一下那三个新名词。段描述符,一个结构体,它有三个成员变量:1、段物理首地址2、段界限3、段属性我们再来重温一遍描述符表,也就是一个数组,什么样的数组呢?是一个段描述符组成的数组。接下来看看段选择子:段选择子,也就是数组的索引,但这时候的索引不在是高级语言中数组的下标,而是我们将要找的那个段描述符相对于数组首地址(也就是全局描述表的首地址)偏移位置。就这么简单,如图:图中,通过Selector(段选择子)找到存储在Descriptor Table(描述符表)中某个Descriptor(段描述符),该段描述符中存放有该段的物理首地址,所以就可以找到内存中真正的物理段首地址SegmentOffset(偏移量):就是相对该段的偏移量物理首地址+偏移量就得到了物理地 址本图就是DATA但这时,心细的朋友就发现了一个GDTR这个家伙还没有提到!我们来看一下什么是GDTR ?Global Descriptor Table Register(全局描述符表寄存器)但是这个寄存器有什么用呢?大家想一下,段描述符表现在是存放在内存中,那CPU是如何知道它在哪里呢?所以,Intel 公司设计了一个全局描述符表寄存器,专门用来存放段描述符表的首地址,以便找到内存中段描述符表。这时,段描述符表地址被存到GDTR寄存器中了。好了,分析就到这,我们来看一下正式的定义:当x86 CPU 工作在保护模式时,可

汇编语言习题

汇编语言习题 一、单项选择题 1. 汇编语言源程序中,每个语句由四项组成,如语句要完成一定功能,那么该语句中不可省略的项是( )。 A、名字项 B、操作项 C、操作数项 D、注释项 2. 在汇编语言程序中,对END语句的叙述正确的是()。 A、是一可执行语句 B、表示程序执行到此结束 C、表示源程序到此结束 D、在汇编后要产生机器码 3. 汇编语言源程序中,每个语句可由四项组成,其中名字项是一个符号,下面列出的有效名字是() A、Variable B、First & ld C、0FFFFH D、'Memphis' 4.用一条指令仅实现将BX+SI=>AX的方法是() A、XCHG AX,[BX][SI] B、MOV AX,[BX+SI] C、LEA AX,BX[SI] D、LEA AX,[BX][SI] 5.设 SP初值为2000H,执行指令"PUSH AX"后,SP的值是() A、1FFFH B、1998H C、2002H D、1FFEH 6.条件转移指令JC产生程序转移的条件是() A、CF=1 B、CF=0 C、CF=1和ZF=1 D、CF=1和ZF=0 7.选用串操作指令时,错误的操作是() A、置方向标志位 B、根据串操作指令设置重复次数并送入CX C、设置源操作数及目的操作数指针 D、源操作数和目的操作数都可以加段超越 8.设AL=20H,SI=0500H,DS=3000H,(30500H)=0C0H,CF=1。执行SBB AL,[SI]后,正确的结果是() A、AL=5FH SF=1 CF=1 B、AL=60H SF=1 CF=0 C、AL=5FH SF=0 CF=1 D、AL=60H SF=0 CF=0 9.设AX=1000H,执行NOT AX指令后,正确的结果是() A、AX=1001H B、AX=0EFFH C、AX=1000H D、AX=0111H 10. 设DS=8225H,DI=3942H,指令NEG BYTE PTR[DI]操作数的物理地址是( ) A、85B92H B、86192H C、BB690H D、12169H 11. 可用作寄存器间接寻址或基址、变址寻址的地址寄存器,正确的是() A、AX,BX,CX,DX B、DS,ES,CS,SS C、SP,BP,IP,BX D、SI,DI,BP,BX 12. 循环指令LOOPNZ终止循环的条件是( )。 A、CX=0,且ZF=0 B、CX=0,或ZF=1 C、CX10,且ZF=0 D、CX10,或ZF=1 13. 设AH=0,AL=06H,BL=09H,执行指令 ADD AL,BL AAA 之后,其结果应是()。 A、 AH=01,AL=05 B、 AH=1 AL=15 C、 AH=0 AL=0FH D、 AH=0 AL=05 14. 下面的数据传送指令中,错误的操作是()。 A、 MOV SS:[BX+DI],1000H B、 MOV DX,1000H C、 MOV WORD PTR[BX],1000H D、 MOV DS,2000H 15.DA1 EQU BYTE PTR DA2 DA2 DW 0ABCDH ┇ SHL DA1,1 SHR DA2,1

单片机补充作业

5-40 以中断方式,用汇编语言编写定时器T0方式0,1,2下,定时1ms 的程序。设系统focs = 12MHz 。 解1:方式0 确定装入T0的常数。机器周期为: 设所需初值为x ,则 =1C18H = 1 1100 0001 1000B 根据13位定时器的特性,TH0放x 的高8位,TL0放低5位,我们将x 值重排如下:x = 1110 0000 1 1000,即得本任务的时间常数为:TH0 = E0H ,TL0 = 18H 。 ORG 0000H AJMP MAIN ORG 000BH LJMP TIME0INT ORG 0050H MAIN : MOV SP ,#60H MOV TMOD ,#00H MOV TL0,#18H MOV TH0,#0E0H SETB ET0 ;允许T0中断 SETB EA ;开放总中断 SETB TR0 ;启动T1定时 SJMP $ TIME0INT : CLR T R0 ;禁止T0 CLR E T0 RETI ;中断返回 END ORG 0000H AJMP MAIN ORG 000BH LJMP TIME0INT ORG 0050H MAIN : MOV SP ,#60H MOV TMOD ,#01H MOV TL0,#18H MOV TH0,#0F0H SETB ET0 ;允许T0中断 SETB EA ;开放总中断 SETB TR0 ;启动T1定时 SJMP $ TIME0INT : CLR TR0 ;禁止T0 CLR ET0 s MHz μ 112)(12=分频3 613101101)2(--?=??-x 7192102313=-=x

Gate A20与保护模式

Gate A20与保护模式 大家都知道,8088/8086只有20位地址线,按理它的寻址空间是2^20,应该是1024KB,但PC机的寻址结构是segment:offset,segment和offset都是16 位的寄存器,最大值是0ffffh,换算成物理地址的计算方法是把segment左移4位,再加上offset,所以segment:offset所能表达的寻址空间最大应为0ffff0h + 0ffffh = 10ffefh(前面的0ffffh是segment=0ffffh并向左移动4位的结果,后面的0ffffh是可能的最大offset),这个计算出的10ffefh是多大呢?大约是1088KB,就是说,segment:offset的地址表达能力,超过了20位地址线的物理寻址能力,你说这是不是有点麻烦。在早先,由于所有的机器都没有那么大的内存,加上地址线只有20位,所以当你用segment:offset的方式企图寻址100000h这个地址时,由于没有实际的第21位地址线,你实际寻址的内存是00000h的位置,如果你企图寻址100001h这个地址时,你实际得到的内容是地址00001h上的内容,所以这个事对实际使用几乎没有任何影响,但是后来就不行了,出现了80286,地址线达到了24位,使segment:offset寻址100000h--10ffefh这将近64K的存储器成为可能,为了保持向下兼容,于是出现了A20 Gate,这是后话,我们后面再细说。 我们可能经常听到一些只有在PC机上才有的一些关于存储器的专有名词,包括:常规内存(Conventional Memory)、上位内存区(Upper Memory Area)、高端内存区(High Memory Area)和扩展内存(Extended Memory),我尽量把这几个东东说明白,这需要下面这张著名的图。 这张图很清楚地说明了问题,大家都知道,DOS下的“常规内存”只有640K,这640K就是从0--A0000H这段地址空间;所谓“上位内存区”,指的就是20位地址线所能寻址到的1M地址空间的上面384K空间,就是从A0001H--100000H 这段地址空间,也就是我们说的用于ROM和系统设备的地址区域,这384K空间和常规内存的640K空间加起来就是20位地址线所能寻址的完整空间 1024KB;由于80286和80386的出现使PC机的地址线从20位变成24位又变成32位,寻址能力极大地增加,1M以上的内存寻址空间,我们统称为“扩展内存”;这里面绝大部分内存区域只能在保护模式下才能寻址到,但有一部分既可以在保护模式下,也可以在实模式下寻址,这就是我们前面提到过的地址100000h--10ffefh之间的这块内存,为了表明其特殊性,我们把这块有趣的内存区叫做“高端内存”。 前面我们提过由于IBM的愚蠢设计给PC机的内存结构埋下了麻烦的伏笔,现在我们来说说这个麻烦。我们都见过PC机上的内存条,但是由于上位内存区

第3章作业

第3章从8086到Pentium系列微处理器的技术发展 教材习题解答 1. 简述80286的特点和保护模式的保护功能。 【解】80286的特点: ①CPU内部分为四个处理部件:EU(执行部件)、AU(地址部件)、IU(指令部件)和BU(总线部件)。这四个处理部件可以并行的进行操作,提高了处理速度。 ②数据线和地址线完全分离。在一个总线周期中,当有效数据出现在数据总线上的时候,下一个总线周期的地址已经送到地址总线,形成总线周期的流水作业。 ③具有“实地址模式”(Real Address Mode,简称为“实模式”)和“保护虚地址模式”(Protected V irtual Address Mode,简称为“保护模式”)”两种工作模式。 ④能运行实时多任务操作系统,支持存储管理和保护功能。 ⑤实现了虚拟存储管理。 ⑥与80286 配合使用的数学协处理器是80287,它基本与8087相同,但适应80286 的两种工作模式。 保护模式体现了80286的特色,主要是对存储器管理、虚拟存储和对地址空间的保护。在保护模式下,可为每个任务提供多达1GB的虚拟存储空间和保护机制,有力地支持了多用户、多任务的操作。那些内存装不下的逻辑段,将以文件形式存在外存储器中,当处理器需要对它们进行存取操作时就会产生中断,通过中断服务程序把有关的程序或数据从外存储器调入到内存,从而满足程序运行的需要。 保护模式为不同程序设置了四个特权级别,可让不同程序在不同的特权级别上运行。依靠这一机制,可支持系统程序和用户程序的分离,并可进一步分离不同级别的系统程序,大大提高了系统运行的可靠性。 2. 简述80386 的特点、80386引脚与8086的区别。 【解】80386 的特点: 80386是全32位结构,它的外部数据总线和内部数据通道,包括寄存器、ALU和内部总线都是32位的。 80386 有3 种工作模式:实模式、虚拟86模式、386的保护模式。 80386的硬件结构可分成6个逻辑单元,它们以流水线方式工作,运行速度可达4MIPS。其硬件设计有支持段页式存储管理部件,易于实现虚拟存储系统。在保护模式下的分段寻址体系,与操作系统相配合可以组成虚拟存储器系统,一个任务的最大虚拟空间可达246=64 TB。 80386硬件支持多任务处理,用一条指令就可以实现任务切换。 80386设置了4级特权级,按优先顺序依次为0级、1级、2级、3级,前3级用于操作系统程序,后1级用于用户程序。 80386引脚与8086的区别见表3-1。 表3-1 80386引脚与8086的区别 8086CPU 80386CPU 共有40个引脚共有132个引脚 16条地址/数据复用线4条地址线34条地址线 32条数据线 在总线宽度控制信号16 BS的控制下,可实现16位或32位数据传送。字节控制信号0 BE~3 BE 协处理器接口信号 (1) PEREQ:协处理器向80386发出的请求信号,有效时表示协处理器请求与存储器之间传送数据。80386响应该请求后,将按照指令的要求控制对存储器的读写。 (2) BUSY:协处理器向80386发出的状态信号,有效时表示协处理器正在执行指令,处于忙状态,暂时不能接受新的指令。 (3)ERROR:协处理器向80386发出的状态信号,有效时表示协处理器出错。80386在检测到ERROR信号后,将转到错误处理子程序来处

汇编语言部分作业题(含答案)

一、填空题 1、编写一条宏指令CLRB,完成用空格符将一字符区中的字符取代的工作。字符区首地址及其长度为变元。 宏定义如下: CLRB MACRO N, CFIL MOV CX, () CLD MOV ( ), ' ' ;;取空格符的ASCII码 () DI, CFIL REP ( ) ( ) 正确答案: 第一空: n 第二空: al 第三空: LEA 第四空: STOSB 第五空: endm 我的答案:得分: 6.6分 第一空: N 第二空: AL 第三空: LEA 第四空: STOSB 第五空: ENDM 2、某工厂计算周工资的方法是每小时的工资率RATE乘以工作时间HOUR,另外每工作满10小时加奖金3元,工资总数存放在WAG中。请将周工资的计算编写成一条宏指令WAGES. 宏定义如下: WAGES MACRO RATE, HOUR, WAG MOV (), HOUR ;;计算周工资(WAG),公式为:HOUR* RATE MOV BL, RATE MUL BL MOV WAG, AX MOV AL, HOUR ;;计算奖金存入(AX),公式为:HOUR/10的商*3 MOV AH, 0

MOV BL, 10 DIV () MOV BL, () MUL () ADD WAG, ();;计算周工资总数 ENDM 正确答案: 第一空: al 第二空: bl 第三空: 3 第四空: BL 第五空: AX 我的答案:得分: 6.6分 第一空: AL 第二空: BL 第三空: 3 第四空: BL 第五空: AX 3、下面的程序段是二进制到十六进制转换程序,请填空。 mov ch, 4 rotate: mov cl, 4 rol bx,() mov al, bl and al,() add al, 30h ; ’0’~’9’ ASCII 30H~39H cmp al, 3ah jl printit add al,() ; ’A’~’F’ ASCII 41H~46H printit: mov() , al mov ah, 2 int 21h () jnz rotate 正确答案: 第一空:

保护模式编程

第1章保护模式编程一 如果想更深、更亲近的了解电脑软件。那么学习cpu是你的必选!! 386是CPU史的一大转折点,那386做基础课是最好不过了。那么我们将开始进行学习之旅!!!大家跟我一块学习吧,呵呵!!! 1.1 准备工作 l1、NASM 编译环境(当然Masm 也可以但是用它来写COM程序比较 麻烦) l2、虚拟机 Virtual PC(Windows平台,执行比较快,即模拟又虚拟硬件)、 WMWarve(WIndows平台虚拟硬件,)、 Bochs(支持Windows平台、也支持在Linux平台上运行有RPM版本的) 我们这些生长在Windows这棵大树下的朋友们,还是用Virtual PC吧.。 l3、写虚拟启动镜像文件的程序 :不知道我观察的对不对?用Nasm 编译一个bin 然后将它转换为img 镜像文件的时候。只要文件大小符合软驱的标准就能启动。那么就代表a.bin 与a.img 文件的内容一模样就是文件大小不一样!我是不太了解镜像文件格式.我用的是Virtual PC。 1.2 开始接触引导程序 1.2.1 Com文件 Com文件是纯二进制的文件,也是直接与Cpu交换的顺序指令文件。Com文件的大小是有限制的,不能超过64KB.因为8086时代的CPU地址线是20位的,20位能表达的数值也就是fffffh(1MB )。而寄存器最高也只是16位,无法用5个F的形式来表达地址,所以用CS(段基地址)*16:IP(偏移地址)来寻址!80386后通用寄存器都得到了32位扩展! 而Cpu地址线也得到了32位的扩展。引导程序前期是需要进入实模式的,因为这是硬件上的限制是IA32的限

汇编语言课后作业

《汇编语言》课后作业 第一次作业 1、编写程序,将AX寄存器中的16位数,每连续4位分成一组,共4组, 然后把这4组数分别放在AL、BL、CL和DL寄存器中。用Debug工具调试程序,查看每条指令执行后,各寄存器的变化。 第二次作业 1、编写程序求数据段中8个字节型数据的累加和。部分代码如下。 Assume cs:codesg, ds:datasg Datasg segment DB 02H,13H, 02H, 35H, 1AH, 35H, 00H, 12H DW 0H ;此字型单元用来保存累加和 Datasg ends 第三次作业 1、编写程序,将内存中03FF:0~03FF:F中的16个数据复制到内存 0000:200~0000:20F中。 2、编写程序,利用堆栈将内存中03FF:0~03FF:F中的16个数据逆序复制到 内存0000:200~0000:20F中。 第四次作业 1、编写程序,在命令行窗体中输出如下图案(红底绿字高亮闪烁)。

程序执行效果,请在DOS命令行下运行zy4.exe文件。 第五次作业 1、编写程序,将数据段中的字符串完成大小写转换。字母字符大写转换成 小写,小写转换成大写,其他字符不变。 如:datasg segment db '$BaSic!InfOrIon*' datasg ends 程序执行后,数据段中的字符串变成了’$bAsIC!iNFoRiON*’。 是有debug工具查看数据段内容如下: 1)执行转换前,数据段的内容如下图 2)执行转换后,数据段的内容如下图 选做题(该题不计入课后作业成绩) 1、编写程序,将数据段中的字型数据以10进制的形式显示。 如:data segment dw 35A6H data ends 35A6H十进制值为13734,显示为13734,如下图:

保护模式下寻址

保护模式下寻址 网上看到的一强帖,不转不行了,牛人啊,把这段代码拿捏的相当到位括号中是我的加注 段机制轻松体验 [内存寻址] 实模式下的内存寻址: 让我们首先来回顾实模式下的寻址方式 段首地址×16+偏移量=物理地址 为什么要×16?因为在8086CPU中,地址线是20位,但寄存器是16位的,最高寻址64KB,它无法寻址到1M 内存。于是,Intel设计了这种寻址方式,先缩小4位成16位放入到段寄存器,用到时候,再将其扩大到20位,这也造成了段的首地址必须是16的倍数的限制。 保护模式下分段机制的内存寻址: 保护模式下分段机制是利用一个称作段选择符的偏移量,从而到描述符表找到需要的段描述符,而这个段描述符中就存放着真正的段的物理首地址,再加上偏移量 一段话,出现了三个新名词: 1、段选择子 2、描述符表 3、段描述符 我们现在可以这样来理解这段话:有一个结构体类型,它有三个成员变量:段物理首地址段界限段属性内存中,维护一个该结构体类型的是一个数组。而分段机制就是利用一个索引,找到该数组对应的结构体,从而得到段的物理首地址,然后加上偏移量,得到真正的物理地址。 公式:xxxx:yyyyyyyy 其中,xxxx也就是索引,yyyyyyyy是偏移量(因为32位寄存器,所以8个16进制)xxxx存放在段寄存器中。 现在,我们来到过来分析一下那三个新名词。段描述符,一个结构体,它有三个成员变量:1、段物理首地址2、段界限3、段属性 我们再来重温一遍描述符表,也就是一个数组,什么样的数组呢?是一个段描述符组成的数组。 接下来看看段选择子:段选择子,也就是数组的索引,但这时候的索引不在是高级语言中数组的下标,而是我们将要找的那个段描述符相对于数组首地址(也就是全局描述表的首地址)偏移位置。 就这么简单,如图:

80386 和 保护模式

80386 和保护模式 ___William Liu Intel CPU 一般可以运行在两种模式之下,即实模式和保护模式。早期的 Intel CPU ( 8086 , 8088 )只能工作在实模式之下,系统中只能运行单个任务,而且只能使用实地址模式。对于 Intel 80386 以上的芯片则还可以运行在 32 位的保护模式之下。在保护模式之下的 CPU 可以支持多任务;支持 4GB 的物理内存;支持 64TB 的虚拟内存;支持内存的页式管理和段式管理以及支持特权级。 本文档将首先介绍 Intel 80386 CPU 的几个内部寄存器,然后再由浅入深的分别介绍保护模式下的段式管理,页式管理,虚拟内存,多任务以及特权级管理等几个方面。 Intel 80386 CPU 的内部寄存器 这一部分先大致介绍一下 386 的内部寄存器,具体细节在后面的几节中再详细说明。一般来说, CPU 设计用来系统编程的系统寄存器包括如下几类: ?标志寄存器 (EFLAGS) ?内存管理寄存器 (GDTR , LDTR , IDTR , TR) ?控制寄存器 (CR0 , CR1 , CR2 , CR3 , CR4) ?兼容 8086 通用寄存器( EAX , EBX , ECX , EDX ) ?兼容 8086 段寄存器( CS , DS , ES , SS , FS , GS ) ?兼容 8086 数据寄存器( ESI , EDI , EIP , ESP ) 下面分别加以介绍:

1) 标志寄存器 EFLAGS : 跟 8086/8088 的 FLAGS 大致差不多。只不过位宽由 16bit 变成了 32bit ,负责的状态标志也多了一些。见图一所示: 图一: EFLAGS 的结构 其中系统标志: VM -虚拟 8086 模式; RF -恢复标志; NT -任务嵌套标志;IOPL - I/O 特权级标志; IF -中断允许标志。 2) 内存管理寄存器: 一共有 4 个,用于分段内存管理,都是用于存放指针的,只是所指的再内存单元中的内容有所不同。 GDTR 全局描述符表寄存器( Global Descriptor Table Register ),存放的是一个指向内存单元列表的指针,用于指向全局段描述表( GDT ),如图二所示。共 48bit ,高 32bit 是 GDT 的基址,低 16bit 描述 GDT 的长度。由于每项 8Byte ,所以共可以有 2^(16)/8=2^13 项。 IDTR 中断描述符表寄存器( Interrupt Descriptor Table Register ),存放的是也一个指向内存单元列表的指针,用于指向全局中断描述符表( IDT ),如图二所示。跟 GDTR 一样,共 48bit 。

汇编语言程序第二次作业

一、单项选择题(只有一个选项正确,共10道小题) 1. 若PORT_VAL<5,则执行指令MOV BX,((PORT_VAL LT 5) AND 20) OR ((PORT_VAL GE 5) AND 30)后BX的内容是:()。 (A) 20 (B) 30 (C) 5 (D) 10 你选择的答案:未选择 [错误] 正确答案:A 解答参考: 2. 假设(AL)=10010010, MOV CL,4 SHL AL,CL 执行上述指令后CF和AL的内容是()。 (A) AF=1,(AL)=00001001 (B) AF=0,(AL)=00001001 (C) AF=1,(AL)=00100000 (D) AF=0,(AL)=00100000 正确答案:C 解答参考: 3. 下面指令序列测试BH中的数是否为奇数,若为奇数则转移至K1处,横线处的指令应为()。 TEST BH,01H _____K1 (A) JNE (B) JZ (C) JS (D) JC 正确答案:A 解答参考: 4. 已知标号NEXT与指令MOV AX,TYPE NEXT在同一个段内,则AX的值为()。

(A) 0 (B) 1 (C) 2 (D) -1 正确答案:B 解答参考: 5. DATA SEGMENT BUF DB 1,2,3,4,5 COUNT EQU -BUF DATA ENDS 在以上数据段中COUNT的值为( ) (A) 3 (B) 5 (C) 4 (D) 6 正确答案:B 解答参考: 6. 下列是8位二进制数的补码,其中真值最大的是()。 (A) 10001000 (B) 11111111 (C) 00000000 (D) 00000001 你选择的答案:未选择 [错误] 正确答案:D 解答参考: 7. 16位有符号数的补码所表示的十进制数的范围是()。 (A) -32767~+32768 (B) -32768~+32767 (C) -65535~+65536 (D) 0~65535 你选择的答案:未选择 [错误] 正确答案:B 解答参考:

X86体系中保护模式下的内存访问机制_湛辉来

文章编号:1000-582X(2002)06-0067-04 X86体系中保护模式下的内存访问机制Ξ 湛辉来,曾 一 (重庆大学计算机学院,重庆400044) 摘 要:保护模式是X86体系结构的一种重要的工作方式,为在X86平台上实现的多任务、多进程操作系统提供了相应的硬件支持。在计算机的底层开发过程中,了解计算机体系结构中的主要部件-内存的工作方式是及其重要的。文章介绍了当前较流行的微机体系结构-X86系统中的内存的组织、管理、和访问机制,分析了X86在保护模式下分段机制、分页机制中的一些主要的数据结构和相应的硬件支持,并详细描述了分段机制中逻辑地址到线性地址的转换,分页机制中虚拟地址到物理地址的转换过程。通过分页和分段机制,可以实现多进程操作系统中的进程独立地址空间,以及对操作系统中内存的保护措施,从而及时而有效地防止了因内存的非法访问而导致的系统崩溃。 关键词:保护模式;描述符;描述符表;页表;页目录 中图分类号:TP31611文献标识码:A Intel的80X86CPU系列芯片可在2种模式下工作:实模式、保护模式[1]。实模式是MS-DOS的运行环境。当内存寻址模式为实模式时,采用80286的20位地址线的存储器分段线性管理技术,存储器容量最大为1M B,线性地址与物理地址一致,对物理内存单元读写直接、灵活。但因受限于640K基本内存,使大量的扩展内存的使用受到制约,同时,分段的64K范围限制影响了内存访问的连续性,从而使系统的内存资源难以得到充分利用。在保护模式下,系统采用分段机制和分页机制,提供了灵活的寻址方式,使得应用程序可以访问多达4G B的存储空间,并为操作系统和应用程序实现虚拟存储器提供了相应的硬件支持,从而打破了实模式下内存寻址所受到的制约,提高了内存资源的使用效率。 1 X86的分段机制 X86的分段机制就是将X86的线性地址空间分成若干空间段(Segment),利用这些段来存储(记录)代码和数据,通过对段的保护来提供一种对数据或代码的保护[2]。这种寻址模式允许CPU访问装在1M B以上的数据和程序代码,就象在实模式中访问1M B以内的内存一样。1.1 分段机制中的数据结构 在分段机制,X86使用了如下几种主要数据结构: 1)段描述符(Segment Descriptor):用来描述一个段的位置、长度以及访问权限。一个描述符由8个字节组成,具体的格式如下 : 其中:基地址描述了该段的开始位置共32位,使得该段可以从4G空间里的任意一个位置开始。段的长度是由20位的界限和一个标志位G决定。标志位G位于0字节的最高一个比特,它的含义如下: 0:段的长度=界限 范围为1B~1M B 1:段的长度=界限34K 范围为4K B-4G B 2)全局描述符表(G DT,G lobal Describe T able):存放系统用的段描述符和各项任务共用的段描述符; 3)局部描述符表(LDT,Local Describe T able):存放某个任务专用的各段的段描述符; 每个描述符表中最大可以放8,192个段描述符,因此,每个描述符表的最大长度为64K B。 1.2 分段机制的硬件支持 X86提供了如下几个用于支持分段机制的寄存器:  2002年6月重庆大学学报 (自然科学版)V ol.25 N o.6第25卷第6期Journal of Chongqing University(Natural Science Edition)Jun.2002 Ξ收稿日期:2002-01-21 作者简介:湛辉来(1972-),男,重庆人,重庆大学硕士研究生。主要研究方向:软件工程及计算机体系结构。

汇编语言编程实验报告

汇编语言编程实验报告 学号: 姓名: 成绩:

目录 一、实验一: ................................................... 错误!未定义书签。 二、实验二: (4) 三、实验三: (8) 四、实验四: (10) 五、实验五: ................................................... 错误!未定义书签。 六、实验六: (19) 七、汇编实验总结 (23)

实验一 一.实验题目 【汇编语言补充作业T20】编写完整程序,利用DOS系统功能调用,从键盘输入一个字符串,并将该字符串从屏幕上换行后并输出。 二.程序流程及思路 实现字符串输入,需要分成三个步骤: 1、在数据段中定义一个缓存区为存放字符串做准备; 2、DOS系统功能调用0AH号子功能,(DS:DX)= 输入缓冲区首址; 3、在输入的字符串尾加上‘$’字符,以作为输出结束条件。 实现字符串输出,则需要注意的问题是: 1、缓冲区第三个字节才开始存放输入的字符,前两个字节分别存放缓冲区长度 和字符串实际字符数; 2、输出回车换行可利用字符串:CR DB 0AH,0DH,’$’。 三.源程序清单 DATA SEGMENT N EQU 50 MAXLEN DB N ;缓冲区字符的最大长度 ACTLEN DB ? ;实际字符个数 STRING DB N DUP(?) ;字符空间 CR DB 0AH,0DH,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX LEA DX,MAXLEN MOV AH,0AH INT 21H ;字符串输入 MOV AH,09H LEA DX,CR INT 21H ;回车换行 MOV BL,MAXLEN+1 ;取实际的字符长度 MOV BH,0 LEA SI,MAXLEN+2 ;取字符开始的首地址

相关主题