结合实际需求,本次报告主要从以下几个方面进行报告叙述。
1.画出8086CPU的工作原理示意图,并将以说明
2.画出80386CPU的工作原理示意图,并将以说明
3.上网查阅资料,总结16,32和64位CPU的整数和字符串的表示方法和范围
4.举例说明常用的传输类汇编指令的使用
5.举例说明常用的7种数据寻址方式和3种内存地址的寻址方式
6.举例说明常用的运算类汇编指令,并编程实现“1+2+3+....+100”求和
1.引言和绪论
1.1汇编语言特点分析
汇编语言是计算机提供给用户的最快最有效的语言,也是能够利用计算机的所有硬件特性并能够直接控制硬件的唯一语言。但是由于编写和调试汇编语言程序要比高级语言复杂,因此目前其应用不如高级语言广泛。
汇编语言比机器语言的可读性要好,但跟高级语言比较而言,可读性还是较差。不过采用它编写的程序具有存储空间占用少、执行速度快的特点,这些是高级语言所无法取代的。在实际应用中,是否使用汇编语言,取决于具体应用要求、开发时间和质量等方面作权衡。
汇编语言作为机器语言之上的第二代编程语言,它也有很多优点:
编写的代码因为少了很多编译的环节,可以能够准确的被执行
作为一种低级语言,可扩展性很高
因为代码非常单调,特殊指令字符很少,所以造成了代码的冗长以及编写的困难
因为汇编仍然需要自己去调用存储器存储数据,很容易出现BUG,而且调试起来也不容易
就算完成了一个程序,后期维护时候也需要耗费大量的时间。
因为机器的特殊性造成了代码兼容性差的缺陷。
2 学习报告
2.1 8086工作原理图
图4-1
图4-2
数量最多的处理器引脚是地址引脚和数据引脚,但是功能单一;它们需要共同组成一个地址或数据编码。为了减少引脚数目,8086采用引脚信号分时复用的方法。所谓“分时复用”,是指同一引脚在不同的时刻具有不同的功能。8088 一共有 20 根地址线,也就是 20 个地址引脚。这是肯定的,因为要管理 1M 内存必须有 20根地址线。
AD0-AD7:这低8位是地址线和数据线公用的(分时复用),必须是先传地址后传数据
A16/S3-A19/S6:这时高四位是地址线和状态线的分时复用A8-A15:这是808CPU独用的地址。
CPU可以粗略地分成两个部分——执行单元EU和总线接口单元BIU。核心就是 ALU(算数逻辑运算单元),就是执行计算的。通用寄存器用于保存中间计算结果。FLAGS(标志寄存器)用于保存计算结果的特征,比如:有无进位、有无溢出之类的。而总线接口单元,顾名思义就是和外部打交道的。对于8088/8086CPU 的结构里面,那些寄存器是特别重要的。
2.2 80386CPU工作原理
图4-3
<1>中央处理部件CPU:它由指令部件和执行部件组成。
(1)指令部件包括指令预取和指令译码两部分,各有一个队列,分别为指令预取队列和指令译码队列。指令预取用从存储器取出来的指令代码临时保存在指令预
取队列中,然后见过指令译码的预译码后放入到已译码指令队列中,以供指令执行部件调用。执行部件由8个32位的通用寄存器、1个32位的算术运算单、1个64位的桶形移位器和乘/除硬件。80386采用微程序控制方式,所有80386指令对应的微程序存放在其内部的控制存储器中。指令译码器从指令预取队列中取指令,将操作码译成与该指令操作码相对应的控制ROM的入口地址,并存入译码指令队列中,该队列可容纳3条已译码指令。
(2)执行部件执行从译码指令队列中取出的已译码指令。它包含8个32位通用寄存器、32位的算术运算单元ALU、1个64位的桶形移位器和乘/除硬件。由于采用微程序技术,所以一条80386指令的执行过程实际是逐条执行该指令所对应的微程序中的微指令。出于缩短微指令宽度,即简化控制存储器电路的需要,微指
令中广泛使用字段编译法,因此在行微指令的过程中还需要译码,即控制单元要对微指令的字段进行译码,产生一条指令操作的时序控制信号(即微操作信号)。80386的各个功能部件既能独立工作,又能与其他部件配合工作,因此80386可采用比8086并行度更高的流水线操作方式,如图二所示,从图中可以看出,总线接口部件、指令译码部件、执行部件及存储器管理部件四个部件并行工作,因此80386的指令流水线为4级。
<2>存储管理部件(MMU)由分段部件和分页机构组成,实现了从逻辑地址到物理地址的转换,既支持段式存储管理、页式存储管理,也支持段页存储管理。它存储器采用段、页式结构,80386首次将分页机制引入到80X86结构,每页大小为4KB。
<3>总线接口部件功能:它通过数据总线、地址总线、控制总线来与外部环境联系,包括从存储器中预取指令、读写数据,从I/O端口读写数据,以及其他的控制功能。数据总线和地址总线都是32位的,由于它们是分开的,所以从存储器中存储数据最快也需要两个时钟周期内完成。
2.3 16、32和64位CPU的整数和字符串的表示方法和范围
(1)16位CPU
①对于无符号整数(即正数)取值范围为:2^16-1(0~25535)16位二进制数都可用于表示整数
②对于有符号整数,以16位的最高位表示正数或负数,最高位为0,为正数,最高位为1,为负数
③当最高位为0,0000 0000 0000 0001 到 0111 1111 1111 1111即(1~2^15-1)(1-32767)
④当最高位为 1,即代表负数时,取值范围如下(以补码形式表示):1000 0000 0000 0000 到 1111 1111 1111 1111
⑤对应的十进制数为:-32768(即 -2^15)到 -1。
⑥有符号 16 位整型数据的取值范围是 -32768 到 32767。
(2)32位
①无符号整数位2^32-1(0~4294967295)
②有符号整数同样需要最高位来表示正负
正数:(0~2^31-1)(0到2147483647)
负数:(-2^31~-1)(-2147483648到-1)
③所以有符号整数范围为(-2147483648~2147483647)
(3)64位
①无符号整数位2^64-1(0~18446744073709551615)
②有符号整数同样需要最高位来表示正负
正数:(0~2^31-1)(0到9223372036854775807)
负数:(-2^31~-1)(-9223372036854775808到-1)
③有符号整数范围为(-9223372036854775808~18446744073709551615)
2.4常用的传输类汇编指令的使用
mov传送字或字节 mov ax,1
push把字压入堆栈 push [0]
pop把字弹出堆栈 pop [0]
inI/O端口输入 (语法:in 累加器; {端口号 | dx})
out I/O端口输出 (语法:out {端口号 | dx}; 累加器)
pushf标志入栈
popf标志出栈
2.5常用的7中数据寻址方式和3中内存地址的寻址方式
数据寻址方式:
(1)立即寻址,MOV AX, 1234H
(2)寄存器寻址,寄存器寻址的特点是操作数在CPU内部的寄存器中,在指令中指定寄存器号
(3)直接寻址,MOV ES:[5678H], BL
(4)寄存器间接寻址,MOV [BP], CX
(5)寄存器相对寻址,MOV AX, 3[SI]
(6)基址变址寻址,MOV AX, [BX+DI]
(7)相对基址变址寻址,MOV AX, [BX+DI+1234H]
内存地址寻址方式:
(1)直接寻址
寻址方式:
[idata]
mov ax,ds:[000E]
(2)寄存器间接寻址
寻址方式:
[bx]
mov ax,[bx]
(3)各种变址寻址
寻址方式:
[bx+si] ; [bx+di] mov ax,[bx+si]
[bx+si+idata] ; [bx+di+idata] mov ax,[bx+si+1]
2.6.1常用的运算类汇编指令的使用
算数运算类指令
参加运算的可以是无符号数或带符号数,带符号的数以补码的形式存放或参与运
算
1.加法指令
(1)ADD 目的操作数,源操作数
目的操作数+源操作数——>目的操作数
(2)ADC带进位的加法指令
ADC 目的操作数,源操作数
目的操作数+源操作数+CF——>目的操作数
例子:
MOV AH,0 ;0——>AH
MOV AL,92H ;92H——>AL
ADD AL,86H ;92H+86H=18H——>AL,CF=1
ADC AH,0 ;(AH)+0+CF=0+0+1=1——>AH,即01H=AH
(3)INC 加|指令
INC 操作数 //操作数加1,结果送操作数
操作数可以是任意一个8或16位的通用寄存器或存储单元,不能是立即数
指令中操作数当作无符号数时,主要用于计数器计数或修改指针地址的值。
如:
INC DI ;(DI)=DI+1
INC CX ;(CX)=CX+1
说明:除了指令INC对标志位CF不影响外,其它加法指令对标志位的影响如下
①CF:两个数相加,最高有效位有进位时,即字节运算超出无符号输的范围
0~255,字运算超出无符号数的范围0~65535时,CF=1,否则CF=0.
故两个无符号数相加时,可用CF值来判断是否超出了无符号数的表示范围
如果CF=1表示此无符号数加法运算结果发生了溢出。
②PF:运算结果以二进制数表示时,若"1"的个数为偶数时PF=1,否则PF=0
③AF:运算中D3向D4有进位时,AF=1,否则为0
④ZF:运算结果为0时,ZF=1;否则ZF=0
⑤SF:运算结果最高位为1时,SF=1,否则为0
⑥OF:当两个操作数的符号相同,而相加的结果的符号与操作数的符号相反时
OF=1,否则OF=0。该标志位用来判断带符号数相加的溢出
例如:
ADD AL,30H ;(AH)+30H ——> AL
ADD AX,3000H ;(AX)+3000H ——> AX
ADD BX,[SI] ;(BX)+((SI))——>BX
2.减法指令
(1)SUB
SUB 目的操作数,源操作数
目的操作数=目的操作数-源操作数
(2)SBB 带错位的减法指令
SBB 目的操作数,源操作数
目的操作数=目的操作数-源操作数-CF
(3)DEC 减1指令 格式:DEC 操作数
DEC DI ;DI=(DI)-1
(4)NEG 求补指令
NEG 操作数 //0-操作数的内容后结果回送操作数
MOV DI,05H
NEG DI ;DI=0-(DI)=0-05H=0FBH
(5)CMP 比较指令
CMP 目的操作数,源操作数
执行时目的操作数与源操作数相减,只根据结果设置标志位
操作数均保持原值不变
3.类型扩展指令
为了解决操作数长度的匹配,有时需要把数据类型进行扩展。
主要有把字节扩展成字,把字扩展成双字
CBW:字节扩展成字
CWD:字扩展成双字
例子:
正数的扩展
MOV AL,52H
CBW ;执行指令后,AX=0052H
CWD ;执行指令后,DX=0000H,AX=0052H
负数的扩展
MOV AL,86H
CBW ;执行指令后,AX=FF86H
CWD ;执行指令后,DX=FFFFH,FF86H
4.乘法指令
MUL :无符号数乘法
IMUL:带符号数乘法
目的操作数必须是累加器,不必在指令中写出。
例子:
无符号数乘法
MOV AL,05H
MOV BL,06H
MUL BL //执行结果AX=30=001EH
有符号数乘法
MOV AL,-5
MOV BL,+6
IMUL BL //AX=-30=FFE2H
5.除法指令
DIV:无符号除法
SRC(源操作数)为字节时,AL=AX/SRC的商,AH=AX/SRC的余数
SRC为字时:AX=(DX,AX)/SRC的商,DX=(DX,AX)/SRC的余数
商和余数都是无符号数。
IDIV:有符号除法
操作同上类似,目的操作数必须是累加器AX和DX,不必写出。
理器控制类指令只能完成对CPU的简单控制功能。
共有12条
对标志位操作
CLC(进位位置0指令)
CMC(进位位求反指令)
STC(进位位置为1指令)
CLD(方向标志置1指令)
STD(方向标志位置1指令)
CLI(中断标志置0指令)
STI(中断标志置1指令)
同步控制
WAIT(等待)
ESC(交权)
LOCK(封锁总线)
其他
NOP(无操作)
HLT(暂停)
2.6.2编程实现“1+2+3+…+100”求和
assume cs:code
code segment
mov ax,0
mov bx,1
mov cx,100
s: add ax,bx
inc bx
loop s
int 21h
code ends
end