8086CPU指令和伪指令中英文全解Word下载.docx

上传人:b****2 文档编号:1492889 上传时间:2023-04-30 格式:DOCX 页数:54 大小:49.21KB
下载 相关 举报
8086CPU指令和伪指令中英文全解Word下载.docx_第1页
第1页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第2页
第2页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第3页
第3页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第4页
第4页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第5页
第5页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第6页
第6页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第7页
第7页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第8页
第8页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第9页
第9页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第10页
第10页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第11页
第11页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第12页
第12页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第13页
第13页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第14页
第14页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第15页
第15页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第16页
第16页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第17页
第17页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第18页
第18页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第19页
第19页 / 共54页
8086CPU指令和伪指令中英文全解Word下载.docx_第20页
第20页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

8086CPU指令和伪指令中英文全解Word下载.docx

《8086CPU指令和伪指令中英文全解Word下载.docx》由会员分享,可在线阅读,更多相关《8086CPU指令和伪指令中英文全解Word下载.docx(54页珍藏版)》请在冰点文库上搜索。

8086CPU指令和伪指令中英文全解Word下载.docx

CX 

is 

zero)、je(jump 

equal)、jb(jump 

below)、ja(jump 

above)、jnb(jump 

not 

below)、jna(jump 

above)等;

(3)循环指令,比如,loop;

(4)过程,比如,call、ret(return)、retf(return 

far);

(5)中断,比如,int(interrupt)、iret(interrupt 

return)。

五、处理机控制指令 

这些指令对标志寄存器或其他处理机状态进行设置,比如,cld(clear 

direction)、std(set 

direction)、cli(clear 

interrupt)、sti(set 

interrupt)、nop(no 

operation)、clc(clear 

carry)、cmc(carry 

make 

change)、stc(set 

carry)、hlt(halt)、wait、esc(escape)、lock等都是处理机控制指令。

六、串处理指令 

这些指令对内存中的批量数据进行处理,比如,movsb(move 

string 

byte)、movsw(move 

word)、cmps(compare 

string)、scas(scan 

string)、lods(load 

string)、stos(store 

string)等。

若要使用这些指令方便地进行批量数据处理,则需要和rep(repeat)、repe(repeat 

equal)、repne(repeat 

equal)等前缀指令配合使用。

附:

8086CPU寄存器英文全称 

1、通用寄存器 

AX(accumulator)、BX(base)、CX(count)、DX(data)这些寄存器可以字(16位)或字节(8位)单位形式访问;

SP(stack 

pointer)、BP(base 

pointer)、SI(source 

index)、DI(destination 

index),这些寄存器只能以字(16位)单位形式访问。

2、专用寄存器 

IP(instruction 

pointer)、SP(stack 

pointer);

;

FLAGS又称PSW(program 

status 

word)分为:

① 

条件码 

OF(overflow)、SF(sign)、ZF(zero)、CF(carry)、AF(auxiliary)、PF(parity) 

② 

控制标志 

DF(direction) 

③ 

系统标志位 

TF(trap)、IF(interrupt)、IOPL(I/O 

privilege 

level) 

3、段寄存器 

CS(code)、DS(data)、SS(stack)、ES(extra)

8086伪指令(汇编语言程序格式)

汇编语言程序中的语句可以由指令、伪指令和宏指令组成。

上一章我们介绍了8086指令系统中的6类指令,每一条指令都对应一种CPU操作。

伪指令又称为伪操作,它是在对源程序汇编期间由汇编程序处理的操作,它们可以完成如处理器选择、定义程序模式、定义数据、分配存储区、指示程序结束等功能。

宏指令是由用户按照宏定义格式编写的一段程序,其中语句可以是指令、伪指令,甚至是已定义的宏指令。

宏指令将在第七章中介绍。

伪指令和指令的区别在于,每一条指令必须生成机器代码,然后在程序运行期间由CPU来执行其操作;

而伪指令是在汇编期间由汇编程序执行的操作命令,除了数据定义及存储器分配伪指令分配存储器空间外,其它伪指令不生成目标码。

和各种指令一样,伪指令也是程序设计不可缺少的工具。

下面介绍一些常用的伪指令。

4.2.1段定义伪指令

 

段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:

完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。

4.2.1.1完整的段定义伪指令

完整段定义伪指令的格式如下:

段名SEGMENT

  .

段名ENDS

段名由用户命名。

对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;

对于代码段中则主要是指令及伪指令语句。

定义了段还必须说明哪个段是代码段,哪个段是数据段。

ASSUME伪指令就是建立段和段寄存器关系的伪指令,其格式为:

ASSUME段寄存器名:

段名,…

段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。

·

定位类型:

说明段的起始边界值(物理地址)。

  

组合类型:

说明程序连接时的段组合方法。

类别:

在单引号中给出连接时组成段组的类型名。

连接程序可把相同类别的段的位置靠在一起。

例4.1

  ;

***********************

  data_seg1segment       ;

定义数据段

            .

  data_seg1ends

***********************

  data_seg2segment       ;

定义附加段

  data_seg2ends

  code_segsegment       ;

定义代码段

   assumecs:

code_seg,ds:

data_seg1,es:

data_seg2

  start:

            ;

程序执行的起始地址

setDSregistertocurrentdatasegment

     mov  ax,data_seg1  ;

数据段地址

     mov  ds,ax     ;

存入DS寄存器

setESregistertocurrentextrasegment

     mov  ax,data_seg2  ;

附加段地址

     mov  es,ax     ;

存入ES寄存器

  code_segends        ;

代码段结束

**************************

    end  start

  由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:

  MOV   AX,DATA_SEG1   ;

数据段地址

  MOV   DS,AX      ;

  MOV   AX,DATA_SEG2   ;

  MOV   ES,AX      ;

  如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:

  MOV   AX,STACK_SEG   ;

堆栈段地址

  MOV   SS,AX      ;

  注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。

  为了对段定义作进一步地控制,SEGMENT伪指令还可以增加类型及属性的说明,其格式如下:

  段名  SEGMENT [定位类型][组合类型]['

类别'

]

           .

  段名  ENDS

  []中的内容是可选的,一般情况下,这些说明可以不用。

但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要提供类型和属性的说明。

表4.2.1·

定位类型说明

BYTE段可以从任何地址边界开始

WORD段从字边界开始,即段的起始边界值为偶数

DWORD段从双字的边界开始,即段的起始边界值为4的倍数

PARA段从小段边界开始,即段的起始边界值为16(或10H)的倍数

PAGE段从页边界开始,即段的起始边界值为256(或100H)的倍数

注意:

  定位类型的缺省项是PARA,即在未指定定位类型的情况下,则连接程序默认为PARA。

BYTE和WORD用于把其它段(通常是数据段)连入一个段时使用;

DWORD一般用于运行在80386及后继机型上的程序。

表4.2.2·

 组合类型说明

PRIVATE该段为私有段,连接时将不与其它模块中的同名段合并

PUBLIC该段连接时将与其它同名段连接在一起,连接次序由连接命令指定

COMMON该段在连接时与其它同名段有相同的起始地址,所以会产生覆盖

AT表达式段地址=表达式的值,其值必为16位但AT不能用来指定代码段

MEMORY与PUBLIC同义

STACK将多个同名堆栈段连接在一起,SP设置在第一个堆栈段的开始

组合类型的缺省项是PRIVATE。

 例4.2在连接之前已定义两个目标模块如下:

  模块1  SSEG SEGMENT PARA STACK

       DSEG1 SEGMENT PARA PUBLIC'

Data'

       DSEG2 SEGMENT PARA

       CSEG SEGMENT PARA'

Code'

  模块2  DSEG1 SEGMENT PARAPUBLIC'

       DSEG2 SEGMENT PARA

       CSEG SEGMENT PARA'

  以上两个模块分别汇编后产生.OBJ文件,经连接程序连接后产生的.EXE模块如下:

  模块1  CSEG SEGMENT PARA'

  模块2  CSEG SEGMENT PARA'

  模块1+2 DSEG1 SEGMENT PARAPUBLIC'

  模块1  DSEG2 SEGMENT PARA

  模块2  DSEG2 SEGMENT PARA

  模块1  SSEG SEGMENT PARASTACK

4.2.1.2存储模型与简化段定义伪指令

  较新版本的汇编程序(MASM5.0与MASM6.0)除支持完整段定义伪指令外,还提供了一种新的简单易用的存储模型和简化的段定义伪指令。

  1.存储模型伪指令

  存储模型的作用是什么呢?

存储模型决定一个程序的规模,也确定进行子程序调用、指令转移和数据访问的缺省属性(NEAR或FAR)。

当使用简化段定义的源程序格式时,在段定义语句之前必须有存储模型.MODEL语句,说明在存储器中应如何安放各个段。

  MODEL伪指令的常用格式如下:

 .MODEL存储模型

  2.简化的段伪指令

  简化的段定义语句书写简短,语句.CODE、.DATA和.STACK分别表示代码数据段和堆栈段的开始,一个段的开始自动结束前面一个段。

采用简化段指令之前必须有存储模型语句.MODEL。

  3.与简化段定义有关的预定义符号

  汇编程序给出了与简化段定义有关的一组预定义符号,它们可在程序中出现,并由汇编程序识别使用。

有关的预定义符号如下:

  

(1)@code由.CODE伪指令定义的段名或段组名。

  

(2)@data由.DATA伪指令定义的段名,或由.DATA、.DATA?

    .CONST和.STACK所定义的段组名。

  (3)@stack堆栈段的段名或段组名。

4.简化段定义举例

1.存储模型伪指令

表4.2.3 MASM5.0和MASM6.0支持的存储模型:

存储模型

功能

适应操作系统

Tiny(微型)

所有数据和代码都放在一个段内,其访问都为NEAR型,整个程序≤64K,并会产生.COM文件。

MS-DOS

Small(小型)

所有代码在一个64KB的段内,所有数据在另一个64KB的段内(包括数据段,堆栈段和附加段)。

Windows

Medium(中型)

所有代码>64K时可放在多个代码段中,转移或调用可为FAR型。

所有数据限在一个段内,DS可保持不变。

Compact(紧凑型)

所有代码限在一个段内,转移或调用可为NEAR型。

数据>64K时,可放在多个段中。

Large(大型)

允许代码段和数据段都可超过64K,被放置在有多个段内,所以数据和代码都是远访问。

Huge(巨型)

单个数据项可以超过64K,其它同Large模型。

Flat(平展型)

所有代码和数据放置在一个段中,但段地址是32位的,所以整个程序可为4GB。

MASM6.0支持该模型。

OS/2

WindowsNT

Small模型是一般应用程序最常用的一种模型,因为只有一个代码段和一个数据段,所以数据和代码都是近访问的。

这种模型的数据段是指数据段、堆栈段和附加段的总和。

  在DOS下用汇编语言编程时,可根据程序的不同特点选择前6种模型,一般可以选用SMALL模型。

另外,TINY模型将产生COM程序,其他模型产生EXE程序。

FLAT模型只能运行在32位x86CPU上,DOS下不允许使用这种模型。

当与高级语言混合编程时,两者的存储模型应当一致。

2.简化的段伪指令

表4.2.4 简化段伪指令的格式如下表:

简化段伪指令

注释

.CODE[段名]

创建一个代码段

段名为可选项,如不给出段名,则采用默认段名。

对于多个代码段的模型,则应为每个代码段指定段名。

.DATA

创建一个数据段

段名是:

_DATA

.DATA?

创建无初值变量的数据段

_BSS

.FARDATA[段名]

建立有初值的远调用数据段

可指定段名,如不指定,则将以FAR_DATA命名。

.FARDATA?

[段名]

建立无初值的远调用数据段

可指定段名,如不指定,则将以FAR_BSS命名。

.CONST

建立只读的常量数据段

CONST

.STACK[大小]

创建一个堆栈段并指定堆栈段大小

stack。

如不指定堆栈段大小,则缺省值为1KB

3.与简化段定义有关的预定义符号

 下面的举例说明预定义符号的使用方法。

在完整的段定义情况下,在程序的一开始,需要用段名装入数据段寄存器,如例4.1中的

       mov  ax,data_seg1

       mov  ds,ax

  若用简化段定义,则数据段只用.data来定义,而并未给出段名,此时可用

       mov  ax,@data

  这里预定义符号@data就给出了数据段的段名。

 4.简化段定义举例

 例4.3

   .MODEL  SMALL

   .STACK  100H   ;

定义堆栈段及其大小

   .DATA        ;

       .

   .CODE        ;

 START:

         ;

起始执行地址标号

   MOV   AX,@DATA ;

   MOV   DS,AX  ;

存入数据段寄存器

      .

   MOV   AX,4C00H

   INT   21H

   END   START   ;

程序结束

  从例4.3可以看出,简化段定义比完整的段定义简单得多。

但由于完整的段定义可以全面地说明段的各种类型与属性,因此在很多情况下仍需使用它。

4.2.2段组定义伪指令

  段组定义伪指令能把多个同类段合并为一个64KB的物理段,并用一个段组名统一存取它。

段组定义伪指令GROUP的格式如下:

  段组名 GROUP 段名[,段名…]

  我们已经知道在各种存储模型中,汇编程序自动地把各数据段组成一个段组DGROUP,以便程序在访问各数据段时使用一个数据段寄存器DS,而GROUP伪指令允许用户自行指定段组。

例4.4将两个数据段DSEG1和DSEG2合并在一个段组DATAGROUP中。

   ;

----------------------------------------------------

   DSEG1 SEGMENTWORDPUBLIC'

DATA'

   DSEG1 ENDS

---------------------------------------------------

   DSEG2 SEGMENTWORDPUBLIC'

   DSEG2 ENDS

   DATAGROUP  GROUPDSEG1,DSEG2  ;

组合成段组

   CSEG   SEGMENTPARAPUBLIC'

CODE'

        ASSUME CS:

CSEG,DS:

DATAGROUP

   START:

  MOV  AX,DATAGROUP

      MOV  DS,AX        ;

DS赋值为段组地址

        .

       MOV  AX,4C00H

        INT  21H

  CSEG   ENDS

-----------------------------------------------------

       END  START

  利用GROUP伪指令定义段组后,段组内统一为一个段地址,各段定义的变量和标号都可以用同一个段寄存器进行访问。

4.2.3程序开始和结束伪指令

  在程序的开始可以用NAME或TITLE作为模块的名字,其格式为:

    NAME     模块名

   TITLE    文件名

  表示源程序结束的伪指令的格式为:

   

    END     [标号]

NAME及TITLE伪指令并不是必需的,如果程序中既无NAME又无TITLE伪指令,则将用源文件名作为模块名。

程序中经常使用TITLE,这样可以在列表文件中打印出标题来。

  END伪指令中的"

标号"

指示程序开始执行的起始地址。

如果多个程序模块相连接,则只有主程序的END要加上标号,其他子程序模块则只用END而不必指定标号。

例4.1~4.3的最后使用了ENDSTART伪指令。

汇编程序将在遇END时结束汇编,并且程序在运行时从START开始执行。

4.2.4数据定义及存储器分配伪指令

  80x86提供了各种数据及存储器分配伪指令,这些伪指令在汇编程序对源程序进行汇编期间,由汇编程序完成数据类型定义及存储器分配等功能。

  数据定义及存储器分配伪指令的格式是:

 [变量]助记符操作数[,…,操作数][;

注释]

 下面介绍ORG伪指令以及常用的数据定义伪指令。

ORG(origin)

  ORG伪指令用来表示起始的偏移地址,紧接着ORG的数值就是偏移地址的起始值。

ORG伪操作常用在数据段指定数据的存储地址,有时也用来指定代码段的起始地址。

 DB(definebyte)

  DB伪指令用来定义字节,对其后的每个数据都存储在一个字节中。

DB能定义十进制数、二进制数、十六进制数和ASCII字符,二进制数和十六进制数要分别用"

B"

和"

H"

表示,ASCII字符用单引号('

'

)括起来。

DB还是唯一能定义字符串的伪操作,串中的每个字符占用一个字节。

 DW(defineword)

  DW伪指令用来定义字,对其后的每个数据分配2个字节(1个字),数据的低8位存储在低字节地址中,高8位存储在高字节地址中,如下例中的变量DATA8的数据存储在0070字地址中,其中0070字节存储0BAH,0071字节存储03H。

DW还可

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2