计算机组成原理4

CPU是可以执行电脑所有算术逻辑运算与基本 I/O 控制功能的一块芯片。一种汇编语言只能用于特定的CPU。也就是说,不同的CPU其汇编语言的指令语法亦不相同。个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMDCYRIX等旁支。后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如38632EAX)、增多了寄存器(如486FS)。为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳。本文所提均为8086汇编语言。寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。用途:1.可将寄存器内的数据执行算术及逻辑运算。2.存于寄存器内的地址可用来指向内存的某个位置,即寻址。3.可以用来读写数据到电脑的周边设备。8086 88位数据寄存器,这些8位寄存器可分别组成16位寄存器:

AH&AL=AX:累加寄存器,常用于运算;

BH&BL=BX:基址寄存器,常用于地址索引;

CH&CL=CX:计数寄存器,常用于计数;

DH&DL=DX:数据寄存器,常用于数据传递。

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:CS(Code Segment):代码段寄存器;DS(Data Segment):数据段寄存器;SS(Stack Segment):堆栈段寄存器;ES(Extra Segment):附加段寄存器。

当一个程序要执行时,就要决定程序代码、数据和堆栈各要用到内存的哪些位置,通过设定段寄存器 CSDSSS 来指向这些起始位置。通常是将DS固定,而根据需要修改CS。所以,程序可以在可寻址空间小于64K的情况下被写成任意大小。 所以,程序和其数据组合起来的大小,限制在DS 所指的64K内,这就是8086以内存做为战场,用寄存器做为军事基地,以加速工作。除了前面所提的寄存器外,还有一些特殊功能的寄存器:IPIntruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程;SPStack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置。BPBase Pointer):基址指针寄存器,可用作SS的一个相对基址位置;SISource Index):源变址寄存器可用来存放相对于DS段之源变址指针;DIDestination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。还有一个标志寄存器FRFlag Register,有九个有意义的标志,将在下文用到时详细说明。

  内存是电脑运作中的关键部分,也是电脑在工作中储存信息的地方。内存组织有许多可存放数值的储存位置,叫地址8086地址总线有20位,所以CPU拥有达1M的寻址空间,这也是DOS的有效控制范围,而8086能做的运算仅限于处理16位数据,即只有064K,所以,必须用分段寻址才能控制整个内存地址。完整的20位地址可分成两部份:1.段基址(Segment)16位二进制数后面加上四个二进制0,即一个16进制0,变成20位二进制数,可设定1M中任何一个64K段,通常记做16位二进制数;2.偏移量(Offset):直接使用16位二进制数,指向段基址中的任何一个地址。如:2222(段基址):3333(偏移量),其实际的20位地址值为:25553。除了上述营养要充分吸收外,你还要知道什么是DOSBIOS功能调用,简单的说,功能调用类似于WIN95 API,相当于子程序。汇编写程序已经够要命了,如果不用MSIBM的子程序,这日子真是没法过了(关于功能调用详见《电脑爱好者》9811期)。

  编写汇编语言有两种主要的方法:1.使用MASMTASM等编译器;2.使用除错程序DEBUG.COMDEBUG其实并不能算是一个编译器,它的主要用途在于除错,即修正汇编程序中的错误。不过,也可以用来写短的汇编程序,尤其对初学者而言,DEBUG 更是最佳的入门工具。因为DEBUG操作容易:只要键入DEBUG回车,A回车即可进行汇编,过程简单,而使用编译器时,必须用到文本编辑器、编译器本身、LINK以及EXE2BIN等程序,其中每一个程序都必须用到一系列相当复杂的命令才能工作,而且用编译器处理源程序,必须加入许多与指令语句无关的指示性语句,以供编译器识别,使用 DEBUG 可以避免一开始就碰到许多难以理解的程序行。DEBUG 除了能够汇编程序之外,还可用来检查和修改内存位置、载入储存和执行程序、以及检查和修改寄存器,换句话说,DEBUG是为了让我们接触硬件而设计的。(8086常用指令用法将在每个汇编程序中讲解,限于篇幅,不可能将所有指令列出)。

  DEBUG的的A命令可以汇编出简单的COM文件,所以DEBUG编写的程序一定要由地址 100hCOM文件要求)开始才合法。FOLLOW MESETP BY SETP(步步回车):

  输入 A100 ; 从DS100开始汇编
   2.输入 MOV DL,1 ; 将数值 01h 装入 DL 寄存器
   3.输入 MOV AH,2 ; 将数值 02h 装入 DL 寄存器
   4.输入 INT 21 ; 调用DOS 21号中断2号功能,用来逐个显示装入DL的字符
   5.输入 INT 20 ; 调用DOS 20号中断,终止程序,将控制权交回给 DEBUG
   6.请按 Enter 
   7.现在已将汇编语言程序放入内存中了,输入 G(运行)
   8.出现结果:输出一个符号。
   ㄖ 输出结果其实不是它,因WORD97无法显示原结果,故找一赝品将就着。
   Program terminated normally

  我们可以用U命令将十六进制的机器码反汇编(Unassemble)成汇编指令。你将发现每一行右边的汇编指令就是被汇编成相应的机器码,而8086实际上就是以机器码来执行程序。
   1.输入 U100,106
   1FED:0100 B201 MOV DL,01
   1FED:0102 B402 MOV AH,02
   1FED:0104 CD21 INT 21
   1FED:0106 CD20 INT 20
   DEBUG可以用R命令来查看、改变寄存器内容。CSIP寄存器,保存了将执行指令地址。
   1.输入R
   AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
   DS=1FED ES=1FED SS=1FED CS=1FED IP=0100 NV UP EI PL NZ NA PO NC
   1FED:0100 B201 MOV DL,01

  当程序由DS100开始执行,那么终止程序时,DEBUG会自动将IP内容重新设定为100。当你要将此程序做成一个独立的可执行文件,则可以用N命令对该程序命名。但一定要为COM文件,否则无法以DEBUG载入。
   输入N SMILE.COM ;我们得告诉DEBUG程序长度:程序从100开始到106,故占用7
   ;字节。我们利用BX存放长度值高位部分,而以CX存放低位部分。
   2.输入RBX ;查看 BX 寄存器的内容,本程序只有7个字节,故本步可省略
   3.输入 RCX  ;查看 CX 寄存器的内容
   4.输入 7  ;程序的字节数
   5.输入 ;用W命令将该程序写入(Write)磁盘中

  修行至此,我们便可以真正接触8086汇编指令了。 当我们写汇编语言程序的时候,通常不会直接将机器码放入内存中,而是打入一串助记符号(Mnemonic Symbols),这些符号比十六进制机器码更容易记住,此之谓汇编指令。助记符号,告诉CPU应执行何种运算。 也就是说,助忆符号所构成的汇编语言是为人设计的,而机器语言是对PC设计的。

转载于:https://my.oschina.net/u/2557747/blog/547385

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值