汇编语言及伪指令打印5章

汇编语言及伪指令打印5章
汇编语言及伪指令打印5章

第五章汇编语言及伪指令

教学要求:

本章以微软宏汇编程序MASM 5.x为蓝本,学习汇编语言源程序的格式、常用伪指令与操作符;同时,介绍汇编语言源程序的汇编、连接、运行过程,以及修改和调试方法。

重点难点:

源程序格式,常量表达,变量定义及属性、段定义、过程定义

第1节汇编程序

一、汇编程序的功能

? 1.检查源程序,找出语法错误,给出出错信息。

? 2.产生目标文件(.obj)和列表文件(.lst)。

? 3.展开宏指令;数制转换

? 4.存储单元分配(变量);段基地址分配

第2节伪指令

一、概述

1.语句一般是由分隔符分成的四个部分组成,它们有两种格式。

(1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令:

标号: 硬指令助记符操作数,操作数;注释

(2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:

名字伪指令助记符参数,参数,... ;注释

·标号和名字是符合汇编语法的用户自定义的标识符,每个标识符的定义是唯一的。标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如_、$、?、@)组成,不能以数字开头。默认情况下,汇编程序不区别标识符中的字母大小写,即大小写不敏感。

·硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令。伪指令助记符主要将在本章和下一章学习。

·处理器指令的操作数可以是立即数、寄存器和存储单元。伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。

·语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性。

·语句的4个组成部分要用分隔符分开。标号后的冒号、注释前的分号是规定采用的分隔符,操作数之间和参数之间一般使用逗号分隔,其他部分通常采用空格或制表符作为分隔符。多个空格和制表符的作用与一个相同。另外,MASM也支持续行符“\”。

伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。

?处理器选择伪操作(.386)

?段定义伪操作

?程序开始和结束伪操作

?数据定义及存储器分配伪操作

?表达式赋值伪操作

?地址计数器与对准伪操作

?基数控制伪操作

2.程序分段

完整的汇编语言源程序也由段组成。

一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。

需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。

所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。

通常,程序还需要一个堆栈段。

二、段的定义

1.完整段定义的源程序格式

段名segment [定位] [组合] [段字] [’类别’]

... ;语句序列(指令、伪指令)

段名 ends

SEGMEN T伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束。段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有‘code’类别,其他为可选属性参数。如果不指定,则采用默认参数;但如果指定,注意要按照上列次序。

(1)段定位(align)属性——指定逻辑段在主存储器中的边界:

BYTE:段开始为下一个可用的字节地址(xxxx xxxxb),属性值为1

WORD:段开始为下一个可用的偶数地址(xxxx xxx0b),属性值为2

DWORD:段开始为下一个可用的4倍数地址(xxxx xx00b),属性值为4

PARA:段开始为下一个可用的节地址(xxxx 0000b),属性值为16

PAGE:段开始为下一个可用的页地址(0000 0000b),属性值为256

简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。完整段定义伪指令的默认定位属性是PARA。

(2)段组合(Combine)属性——指定多个逻辑段之间的关系:

PRIVATE:本段与其他段没有逻辑关系,不与其他段合并。这是完整段定义伪指令默认的段组合方式。

PUBLIC:连接程序把本段与所有同名同类型的其他段相邻地连接在一起,指定一个共同的段地址。这是简化段定义伪指令默认的段组合。

STACK:本段是堆栈的一部分,这是堆栈段必须具有的段组合。

(3)段字(Use)属性——这是为支持32位段而设置的属性。

对于16位x86 CPU来说,它默认是16位段,即USE16。而对于汇编32位x86 CPU指令时,它默认采用32位段,即USE32;但可以使用USE16指定标准的16位段。编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。

(4)段类别(Class)属性——当连接程序组织段时,将所有的同类别段相邻分配。

段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用’code’、’data’

和’stack’来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。

例如:

;lt301b.asm(文件名)

stack segment stack ;定义堆栈段stack

dw 512 dup(?) ;堆栈段的大小是1024字节(512字)空间

stack ends ;堆栈段结束

data segment ;定义数据段data

string db ’Hello,Everybody !’,0dh,0ah,’$’ ;在数据段定义要显示的字符串

data ends ;数据段结束

code segment ’code’ ;定义代码段code

assume cs:code,ds:data,ss:stack ;确定CS、DS、SS指向的逻辑段

start: mov ax,data ;设置数据段的段地址DS

mov ds,ax

mov dx,offset string ;利用功能调用显示信息

mov ah,9

int 21h

mov ax,4c00h ;利用系统功能调用返回DOS

int 21h

code ends ;代码段结束

end start ;汇编结束,同时表明程序起始点为标号start处的指令

完整段定义格式的段定义由SEGMENT和ENDS这一对伪操作实现,由代码段的assume伪指令指定用途。2.指定段寄存器伪指令:

ASSUME 段寄存器:段名[,段寄存器名:段

名, ...]

ASSUME伪指令通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME 伪指令的主要功能。

ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS : IP和SS : SP。由于数据段通常都

需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES。

3.简化段定义格式:

.STACK [大小]

堆栈段伪指令.STACK创建一个堆栈段,段名是:stack。它的参数指定堆栈段所占存储区的字节数,默认是1KB(= 1024 = 400h字节)。

.DATA

数据段伪指令.DATA创建一个数据段,段名是:_DATA。它用于定义具有初值的变量,当然也允许定义无初值的变量。

.CODE [段名]

.CODE伪指令创建一个代码段,它的参数指定该代码段的段名。

使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义的符号,例如:

@CODE——表示.CODE伪指令定义的段名

@DATA——表示由.DATA、.DATA?等定义的数据段的段名

4.程序开始与结束伪指令:

.STARTUP

.STARTUP伪指令按照给定的CPU类型,根据.MODEL语句选择的存储模式、操作系统和堆栈类型,产生程序开始执行的代码;同时还指定了程序开始执行的起始点。在DOS 下,.STARTUP语句还将初始化DS值,调整SS和SP值。

如果不使用.STARTUP语句,我们可以用下面2条指令代替(没有调整堆栈SS : SP):

start: mov ax,@data ;@data表示数据段的段地址

mov ds,ax ;设置DS

.EXIT [返回数码]

.EXIT语句产生终止程序执行返回操作系统的指令代码。它的可选参数是一个返回的数码,通常用0表示没有错误。例如.exit 0对应的代码是:

mov ax,4c00h

int 21h

这是利用了DOS功能调用的4ch子功能(返回DOS功能:AH = 4ch)实现的,它的入口参数就是AL = 返回数码。

5. 汇编结束伪指令:

END [标号]

END伪指令指示汇编程序MASM到此结束汇编过程。源程序的最后必须有一条END语句。可选的标号用于指定程序开始执行点,例如start。连接程序据此设置CS : IP 值。

注意:汇编结束不同于程序执行终止。

过程名称PROC [属性]

指令序列

过程名称ENDP

属性:FAR、NEAR

源程序格式:

对于大多数小型MASM程序,采用简化段定义伪指令,整个源程序格式表达如下:

.model small ;定义程序的存储模式(一般采用small)

.stack ;定义堆栈段

.data ;定义数据段

... ;数据定义

.code ;定义代码段

.startup ;程序起始点,并建立DS、SS内容

... ;程序代码

.exit 0 ;程序结束点,返回DOS

... ;子程序代码

end ;汇编结束

三、变量定义格式

变量定义(Define)伪指令为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。该类伪指令是最经常使用的伪指令,它的汇编格式为:

变量名伪指令表达式列表

·变量名为用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。变量名可以没有,这种情况,汇编程序将直接为初值表分配空间,无符号地址。设置变量名是为了方便存取它指示的存储单元。

·表达式表:是用逗号分隔的参数,主要由数值常数、表达式或?、DUP组成。其中?表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。DUP的格式为:

重复次数 DUP(重复项)

·变量定义伪指令有DB / DW / DD / DF / DQ / DT,它们根据申请的主存空间单位分类。

1.字节定义伪指令DB,用于分配一个或多个字节单元,并可以将它们初始化为指定值。初值表中每个数据一定是字节量(Byte),可以是0~255的无符号数或是-128~+127带符号数,也可以是字符串常数。

例如:

data segment ;数据段

X db ’a’,-5

Y db ’ABC’,?,4*6

Z DB 0,0,0,0,0,0,0,0,0,0

R DB 10 DUP(0)

data ends

利用它们的汇编指令示例:

mov al,X ;此处X表示它的第1个数据,故AL←’a’dec X+1 ;对X为始的第2个数据减1,故成为-6

mov Y,al ;现在Y这个字符串成为’aBC’

2.字定义伪指令DW

字节定义伪指令DW,用于分配一个或多个字单元,并可以将它们初始化为指定值。初值表中每个数据一定是字量(Word),一个字单元可用于存放任何16位数据,如一个段地址、一个偏移地址、两个字符、0 ~ 65535之间的无符号数或-32768 ~ +32767之间的带符号数。

例如:

data segment ;数据段

count dw 8000h, ?,’AB’

number dw 32

array dw 128 dup(0)

data ends

3. 双字定义伪指令DD,用于分配一个或多个双字单元,并可以将它们初始化为指定值。初值表中每个数据是一

个32位的双字量(Double Word),可以是有符号或无符号

的32位整数,也可以用来表达16位段地址(高位字)和16

位的偏移地址(低位字)的远指针。

例如:

Var1 DD 0, ? , 12345678h

farpoint DD 00400078h

4. 定义3字伪指令DF——用于为一个或多个6字节变量分配空间及初始化。

定义4字伪指令DQ——用于为一个或多个8字节变量分配空间及初始化。

定义10字节伪指令DT——用于为一个或多个10字节变量分配空间及初始化。

5.实例:

(1).model small

.stack

.data

bvar DB 16

wvar DW 4*3

dvar DD 4294967295 ;=232-1=FFFFFFFFH qvar DQ ?

DB 1,2,3,4,5

tvar DT 2345

abc DB ’a’,’b’,’c’

msg DB ’Hello’,13,10,’$’

bbuf DB 12 DUP(’month’)

dbuf DD 25 DUP(?)

CALLDOS EQU

.code

.startup ;建立DS

mov bl,bvar

mov ax,word ptr dvar[0] ;取双字到DX.AX

mov dx,word ptr dvar[2]

mov dx,offset msg

mov ah,09h

CALLDOS

.exit 0 ;返回操作系统

end ;汇编结束

四、定位伪指令

用数据定义伪指令分配的数据是按顺序一个接着一个存放

在数据段中的。但有时,我们希望能够控制数据的偏移地址。

ORG 参数;使它后面的数据或指令从参数指定的地址

开始

ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址。例如:

ORG 100h ;从100h处安排数据或程序

ORG $+10 ;使偏移地址加10,即跳过10个字节空间

汇编语言程序中,符号“$”表示当前偏移地址值。例如:在偏移地址100H单元开始定义“dw 1,2,$+4,$+4”,那么在104H单元的值为108H、106H单元的值为10aH。又如:array DB 12,23,34

len EQU $-array

那么len的值就是array变量所占的字节数。

五、地址操作符

标号和名字一经定义便具有以下两类(地址和类型)三种属性:

段值:标号和名字对应存储单元所在段的段地址;

偏移值:标号和名字对应存储单元所在段的段内偏移地址;

类型:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等。

地址操作符取得名字或标号的段地址和偏移地址两个属性值。例如已经熟悉的中括号 [ ]表示将括起的表达式作为存储器地址指针;符号 $ 表示当前偏移地址;段前缀的冒号:也是一种地址操作符,它表示采用指定的段地址寄存器。另外,还有两个经常应用的地址操作符,就是:

OFFSET 名字/标号 ;返回名字或标号的偏移地址

SEG 名字/标号 ;返回名字或标号的段地

把字节变量ARRAY的段地址和偏移地址送入DS和BX就可用下列指令序列实现:

mov ax,seg array

mov ds,ax

mov bx,offset array ;等价于lea bx,array

在前面学习的加、减运算符同样可以用于地址表达式,例如: mov cl,array+4 ;等效于mov cl,array[4],这里的4表示4个字节单元。

六、类型操作符

类型操作符对名字或标号的类型属性进行有关设置。

类型名PTR 名字/标号;使名字或

标号具有指定的类型

PTR操作符中的“类型名”可以是

BYTE/WORD/DWORD/FWORD/QWORD/TBYTE,或者是NEAR/FAR,还可以是由STRUCT、RECORD、UNION以及TYPEDEF定义的类型。使用PTR操作符,可以临时改变名字或标号的类型。

THIS 类型名;创建采用当前地址,但为指定类型的操作数

利用THIS说明的操作数具有汇编时的当前逻辑地址,但具有指定的类型。类型名同PTR操作符中的类型一样。

TYPE 名字/标号;返回一个字量数值,表明名字或标号的类型

另外,操作符SIZEOF和LENGTHOF具有类似TYPE的功能,分别返回整个变量占用的字节数和整个变量的数据项数(即元素数)。实际上:

SIZEOF返回值=LENGTHOF返回值×TYPE返回值

七、应用

.model small

.stack

.data

v_byte equ this byte

;v_byte是字节类型的变量,但与变量v_word地址相同

v_word dw 3332h,3735h ;v_word是字类型的变量target dw 5 dup (20h) ;分配数据空间2×5=10个字节

crlf db 0dh,0ah,’$’

flag db 0

n_point dw offset s_label ;取得标号s_label的偏移地址

.code

.startup

mov al,byte ptr v_word

;用ptr改变w_word的类型,否则与AL寄存器类型不匹配

dec al

mov v_byte,al ;对v_word的第一个字节操作,原来是32H,现在是31H

n_label: cmp flag,1

jz s_label ;flag单元为1,则转移

inc flag

(完整word版)汇编语言常用指令大全,推荐文档

MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。

汇编语言知识大全

第一章基础知识: 一.机器码:1.计算机只认识0,1两种状态。而机器码只能由0,1组成。故机器码相当难认,故产生了汇编语言。 2.其中汇编由三类指令形成:汇编指令(有机器码对应),伪指令,其他符号(编译的时候有用)。 每一总CPU都有自己的指令集;注意学习的侧重点。 二.存储器:1.存储单元中数据和指令没任何差别。 2.存储单元:Eg:128个储存单元(0~127)128byte。 线: 1.地址总线:寻址用,参数(宽度)为N根,则可以寻到2^N个内存单元。 据总线:传送数据用,参数为N根,一次可以传送N/8个存储单元。 3.控制总线:cpu对元器件的控制能力。越多控制力越强。 四.内存地址空间:1.由地址总线决定大小。 2.主板:cpu和核心器件(或接口卡)用地址总线,数据总线,控制总 线连接起来。 3.接口卡:由于cpu不能直接控制外设,需通过接口卡间接控制。

4.各类存储器芯片:RAM,BIOS(主板,各芯片)的ROM,接卡槽的 RAM CPU在操控他们的时候,把他们都当作内存来对待,把他们总的看作一个由 若干个存储单元组成的逻辑存储器,即我们所说的内存地址空间。 自己的一点理解:CPU对内存的操作是一样的,但是在cpu,内存,芯片之间的硬件本身所牵扯的线是不同的。所以一些地址的功能是对应一些芯片的。 第二章寄存器 引入:CPU中含有运算器,寄存器,控制器(由内部总线连接)。而寄存器是可以用来指令读写的部件。8086有14个寄存器(都是16位,2个存储空间)。 一.通用寄存器(ax,bx,cx,dx),16位,可以分为高低位 注意1.范围:16位的2^16-1,8位的2^8-1 2.进行数据传送或运算时要注意位数对应,否则会报错 二.字:1. 1个字==2个字节。 2. 在寄存器中的存储:0x高位字节低位字节;单元认定的是低单元 数制,16进制h,2进制b

(完整word版)汇编语言指令集合-吐血整理,推荐文档

8086/8088指令系统记忆表 数据寄存器分为: AH&AL=AX(accumulator):累加寄存器,常用于运算;在乘除等指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传送数据. BH&BL=BX(base):基址寄存器,常用于地址索引; CH&CL=CX(count):计数寄存器,常用于计数;常用于保存计算值,如在移位指令,循环(loop)和串处理指令中用作隐含的计数器. DH&DL=DX(data):数据寄存器,常用于数据传递。他们的特点是,这4个16位的寄存器可以分为高8位: AH, BH, CH, DH.以及低八位:AL,BL,CL,DL。这2组8位寄存器可以分别寻址,并单独使用。 另一组是指针寄存器和变址寄存器,包括: SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置; BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置; SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针; DI(Destination Index):目的变址寄存器,可用来存放相对于ES 段之目的变址指针。 指令指针IP(Instruction Pointer) 标志寄存器FR(Flag Register) OF(overflow flag) DF(direction flag) CF(carrier flag) PF(parity flag) AF(auxiliary flag) ZF(zero flag) SF(sign flag) IF(interrupt flag) TF(trap flag) 段寄存器(Segment Register) 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器;

汇编语言指令表

汇编语言指令表文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

伪指令 1、定位伪指令 ORG m 2、定义字节伪指令 DB X1,X2,X3,…,Xn 3、字定义伪指令 DW Y1,Y2,Y3,…,Yn 4、汇编结束伪指令 END 寻址方式 MCS-51单片机有五种寻址方式: 1、寄存器寻址 2、寄存器间接寻址 3、直接寻址 4、立即数寻址 5、基寄存器加变址寄存器间接寻址 6、相对寻址 7、位寻址 数据传送指令 一、以累加器A为目的操作数的指令(4条) MOV A,Rn ;(Rn)→A n=0~7 MOV A,direct ;( direct )→A MOV A,@Ri ;((Ri))→A i=0~1 MOV A,#data ; data →A 二、以Rn为目的操作数的指令(3条) MOV Rn ,A;(A)→ Rn MOV Rn ,direct;( direct )→ Rn MOV Rn ,#data; data → Rn 三、以直接寻址的单元为目的操作数的指令(5条) MOV direct,A;(A)→direct MOV direct,Rn;(Rn)→direct MOV direct,direct ;(源direct)→目的direct MOV direct,@Ri;((Ri))→direct MOV direct,#data; data→direct 四、以寄存器间接寻址的单元为目的操作数的指令(3条) MOV @Ri,A;(A)→(Ri) MOV @Ri,direct;(direct)→(Ri) MOV @Ri,#data; data→(Ri) 五、十六位数据传送指令(1条) MOV DPTR,#data16;dataH→DPH,dataL →DPL

汇编语言指令汇总

汇编语言程序设计资料简汇 通用寄存器 8位通用寄存器8个:AL、AH、BL、BH、CL、CH、DL、DH。 16位通用寄存器8个:AX、BX、CX、DX、SI、DI、BP、SP。 AL与AH、BL与BH、CL与CH、DL与DH分别对应于AX、BX、CX和DX的低8位与高8位。专用寄存器 指令指针:IP(16位)。 标志寄存器:没有助记符(FLAGS 16位)。 段寄存器 段寄存器:CS、DS、ES、SS。 内存分段:80x86采用分段内存管理机制,主要包括下列几种类型的段: ?代码段:用来存放程序的指令序列。 ?数据段:用来存放程序的数据。 ?堆栈段:作为堆栈使用的内存区域,用来存放过程返回地址、过程参数等。 物理地址与逻辑地址 ?物理地址:内存单元的实际地址,也就是出现在地址总线上的地址。 ?逻辑地址:或称分段地址。 ?段地址与偏移地址都是16位。 ?系统采用下列方法将逻辑地址自动转换为20位的物理地址: 物理地址= 段地址×16 + 偏移地址 ?每个内存单元具有唯一的物理地址,但可由不同的逻辑地址描述。 与数据有关的寻址方式 立即寻址方式 立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位数或16位数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 例:MOV AL,18 指令执行后,(AL)= 12H 寄存器寻址方式 在寄存器寻址方式中,操作数包含于CPU的内部寄存器之中。这种寻址方式大都用于寄存器之间的数据传输。 例3:MOV AX,BX 如指令执行前(AX)= 6789H,(BX)= 0000H;则指令执行后,(AX)= 0000H,(BX)保持不变。 直接寻址方式 直接寻址方式是操作数地址的16位偏移量直接包含在指令中,和指令操作码一起放在代码段,而操作数则在数据段中。操作数的地址是数据段寄存器DS中的内容左移4位后,加上指令给定的16位地址偏移量。直接寻址方式适合于处理单个数据变量。 寄存器间接寻址方式 在寄存器间接寻址方式中,操作数在存储器中。操作数的有效地址由变址寄存器SI、DI或基址寄存器BX、BP提供。 如果指令中指定的寄存器是BX、SI、DI,则用DS寄存器的内容作为段地址。 如指令中用BP寄存器,则操作数的段地址在SS中,即堆栈段。

单片机汇编语言指令集

汇编语言的所有指令数据传送指令集 MOV 功能: 把源操作数送给目的操作数 语法: MOV 目的操作数,源操作数 格式: MOV r1,r2 MOV r,m MOV m,r MOV r,data XCHG 功能: 交换两个操作数的数据 语法: XCHG 格式: XCHG r1,r2 XCHG m,r XCHG r,m PUSH,POP 功能: 把操作数压入或取出堆栈 语法: PUSH 操作数POP 操作数 格式: PUSH r PUSH M PUSH data POP r POP m PUSHF,POPF,PUSHA,POPA 功能: 堆栈指令群 格式: PUSHF POPF PUSHA POPA LEA,LDS,LES 功能: 取地址至寄存器 语法: LEA r,m LDS r,m LES r,m XLAT(XLATB) 功能: 查表指令 语法: XLAT XLAT m 算数运算指令 ADD,ADC 功能: 加法指令 语法: ADD OP1,OP2 ADC OP1,OP2 格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data 影响标志: C,P,A,Z,S,O SUB,SBB 功能:减法指令 语法: SUB OP1,OP2 SBB OP1,OP2 格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data 影响标志: C,P,A,Z,S,O

INC,DEC 功能: 把OP的值加一或减一 语法: INC OP DEC OP 格式: INC r/m DEC r/m 影响标志: P,A,Z,S,O NEG 功能: 将OP的符号反相(取二进制补码) 语法: NEG OP 格式: NEG r/m 影响标志: C,P,A,Z,S,O MUL,IMUL 功能: 乘法指令 语法: MUL OP IMUL OP 格式: MUL r/m IMUL r/m 影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志) DIV,IDIV 功能:除法指令 语法: DIV OP IDIV OP 格式: DIV r/m IDIV r/m CBW,CWD 功能: 有符号数扩展指令 语法: CBW CWD AAA,AAS,AAM,AAD 功能: 非压BCD码运算调整指令 语法: AAA AAS AAM AAD 影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD) DAA,DAS 功能: 压缩BCD码调整指令 语法: DAA DAS 影响标志: C,P,A,Z,S 位运算指令集 AND,OR,XOR,NOT,TEST 功能: 执行BIT与BIT之间的逻辑运算 语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位 SHR,SHL,SAR,SAL 功能: 移位指令 语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL

单片机汇编语言伪指令

单片机汇编语言伪指令 1.BIT---用于汇编程序的一开始创建一个常量. FLASH_COUNT BIT3EH;创建一个名为FLASH_COUNT的常量,并把立即数3EH赋给这个常量,在程序中就可以直接把FLASH_COUNT等同于立即数3EH进行操作. 2.DATA---定义一个指向特殊功能寄存器区地址的变量. DPTRSW DATA0A2H;DPTRSW指向特殊功能寄存器0A2H地址上. 3.DB---用于汇编程序中定义若干个长度为1个字节的字,这若干个字使用逗号分隔开,如果逗号之间没有数据,汇编器默认为00H. DB10H,11H,,3FH,20H;在目标文件中生成10H,11H,00H,3FH,20H 4.DS---用于保留一块存储器空间给程序变量使用或别的用途. STORAGE DS10;保留一块名叫"STORAGE"的10字节存储空间 5.DW---定义若干个长度为两个字节的字,这若干个字使用逗号分隔开,如果逗号之间没有数据,汇编器默认为0000H. DW0FFFEH,,0102H;在目标文件中生成代码:FFH,FEH,00H,00H,01H,02H 6.END---该伪指令告诉汇编器程序的结束点. 7.EQU---定义某一个符号的值,一旦一个符号被定义后,就不能被另一个EQU或SET指令重复定义. BEEP_COUNT EQU1+1;表达式把2定义给符号BEEP_COUNT 8.IF、ELSE、ENDIF---这3个伪指令是条件选择语句,它们告诉汇编器根据表达式的值,是否汇编某一块程序,没有汇编的块在目标文件中是不存在对应的执行代码的. IF P1.0;如果P1.0=1,就汇编下一行 ELSE01H,02H,03H;在存储器中定义字01H、02H、03H ENDIF;条件选择结束,如果P1.0≠1,上一行不被汇编. 9.INCL---该指令用于在汇编时把其他文件与当前文件结合在一起汇编. INCL"const.def";即把文件"const.def"与当前文件结合在一起汇编. https://www.360docs.net/doc/f418066798.html,---该伪指令用于设置程序计数器PC的初始值. ORG0000H;指令的执行代码在单片机的程序存储器中从0000H开始存储(也可简单写成00H). 11.SET---该伪指令类似EQU,但不同的是SET可以通过另一个SET伪指令重复定义变量的值. COUNT SET3 COUNT SET1;最终COUNT=1

(完整版)汇编语言中常用的伪指令档

汇编语言中常用的伪指令 分类:软件相关2013-01-23 20:13 515人阅读评论(0) 收藏举报areaequ伪指令常用汇编语言 汇编语言中,指令语句在源程序汇编时会产生可供计算机执行的指令代码,即目标代码。汇编程序除指令语句外,还需要提供一些指令,用于辅助源程序的汇编。比如指定程序或数据存放的起始地址,为数据分配一段连续的内存单元等。这些指令在汇编时并不生成目标代码,不影响程序执行,因此称之为伪指令。本文简单总结了常用的伪指令,如下。 1、EQU(Equate) 一般格式为:标号:EQU 操作数 指令功能为将操作数赋予标号,两边的值完全相等。使用EQU伪指令给一个标号赋值后,此标号在整个源文件中值固定。 AREA: EQU 1000H ;将标号AREA赋值为1000H 2、ORG(Origin) 一般格式为:ORG xxxxH(绝对地址或标号) XxxxH决定此语句后第一条指令(或数据)的地址。该段源程序或数据被连续存放在此后的地址内,直到下一条ORG指令为止。 ORG 8000H ;此后目标代码存储在存储器中以0x8000h开始的地址空间中。 ADD R1,#1 MOV R2, #2 3、DB(Define Byte) 一般格式为:标号:DB 字节常数或字符或表达式 标号字段可有可无,字节常数或字符是指一个字节数据。此伪指令的功能是把字节常数或字节串存放至内存连续的地址空间中。 ORG 8000H DATA1:DB 43H,09H,08H DATA2:DB 07H 伪指令DB指定了43H,09H,08H 顺序存放在8000H开始的存储单元中,DATA2中的07H紧挨着DATA1的地址空间存放,即07H存放在8003H单元中。 注:DW(Define Word)指令定义与DB类似,区别在于DW定义一个字,DB定义一个字节。

汇编指令大全

ORG 0000H NOP ;空操作指令 AJMP L0003 ;绝对转移指令 L0003: LJMP L0006 ;长调用指令 L0006: RR A ;累加器A内容右移(先置A为88H) INC A ; 累加器A 内容加1 INC 01H ;直接地址(字节01H)内容加1 INC @R0 ; R0的内容(为地址) 的内容即间接RAM加1 ;(设R0=02H,02H=03H,单步执行后02H=04H) INC @R1 ; R1的内容(为地址) 的内容即间接RAM加1 ;(设R1=02H,02H=03H,单步执行后02H=04H) INC R0 ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少) INC R1 ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少) INC R2 ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少) INC R3 ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少) INC R4 ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少) INC R5 ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少) INC R6 ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少) INC R7 ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少) JBC 20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位L0017: ACALL S0019 ;绝对调用 S0019: LCALL S001C ;长调用 S001C: RRC A ;累加器A的内容带进位位右移(设A=11H,C=0 ;单步执行后查A和C内容为多少) DEC A ;A的内容减1 DEC 01H ;直接地址(01H)内容减1 DEC @R0 ;R0间址减1,即R0的内容为地址,该地址的内容减1 DEC @R1 ; R1间址减1 DEC R0 ; R0内容减1 DEC R1 ; R1内容减1 DEC R2 ; R2内容减1 DEC R3 ; R3内容减1 DEC R4 ; R4内容减1 DEC R5 ; R5内容减1 DEC R6 ; R6内容减1 DEC R7 ; R7内容减1 JB 20H,L002D;如果位(20H,即24H的0位)为1则转移 L002D: AJMP L0017 ;绝对转移 RET ;子程序返回指令 RL A ;A左移 ADD A,#01H ;A的内容与立即数(01H)相加 ADD A,01H ; A的内容与直接地址(01H内容)相加 ADD A,@R0 ; A的内容与寄存器R0的间址内容相加 ADD A,@R1 ; A的内容与寄存器R1的间址内容相加

一些常用的汇编语言指令

汇编语言常用指令 大家在做免杀或者破解软件的时候经常要用到汇编指令,本人整理出了常用的 希望对大家有帮助! 数据传送指令 MOV:寄存器之间传送注意,源和目的不能同时是段寄存器;代码段寄存器CS不能作为目的;指令指针IP不能作为源和目的。立即数不能直接传送段寄存器。源和目的操作数类型要一致;除了串操作指令外,源和目的不能同时是存储器操作数。 XCHG交换指令:操作数可以是通用寄存器和存储单元,但不包括段寄存器,也不能同时是存储单元,还不能有立即数。 LEA 16位寄存器存储器操作数传送有效地址指令:必须是一个16位寄存器和存储器操作数。 LDS 16位寄存器存储器操作数传送存储器操作数32位地址,它的16位偏移地址送16位寄存器,16位段基值送入DS中。 LES :同上,只是16位段基址送ES中。 堆栈操作指令 PUSH 操作数,操作数不能使用立即数, POP 操作数,操作数不能是CS和立即数 标志操作指令 LAHF:把标志寄存器低8位,符号SF,零ZF,辅助进位AF,奇偶PF,进位CF传送到AH 指定的位。不影响标志位。 SAHF:与上相反,把AH中的标志位传送回标志寄存器。 PUSHF:把标志寄存器内容压入栈顶。 POPF:把栈顶的一个字节传送到标志寄存器中。 CLC:进位位清零。 STC:进位位为1。 CMC:进位位取反。 CLD:使方向标志DF为零,在执行串操作中,使地址按递增方式变化。 STD:DF为1。 CLI:清中断允许标志IF。Cpu不相应来自外部装置的可屏蔽中断。 STI:IF为1。 加减运算指令

注意:对于此类运算只有通用寄存器和存储单元可以存放运算结果。如果参与运算的操作数有两个,最多只能有一个存储器操作数并且它们的类型必须一致。 ADD。 ADC:把进位CF中的数值加上去。 INC:加1指令 SUB。 SBB:把进位CF中数值减去。 DEC:减1指令。 NEG 操作数:取补指令,即用0减去操作数再送回操作数。 CMP:比较指令,完成操作数1减去操作数2,结果不送操作数1,但影响标志位。可根据ZF(零)是否被置1判断相等;如果两者是无符号数,可根据CF判断大小;如果两者是有符号数,要根据SF和OF判断大小。 乘除运算指令 MUL 操作数:无符号数乘法指令。操作数不能是立即数。操作数是字节与AL中的无符号数相乘,16位结果送AX中。若字节,则与AX乘,结果高16送DX,低16送AX。如乘积高半部分不为零,则CF、OF为1,否则为0。所以CF和OF表示AH或DX中含有结果的有效数。IMUL 操作数:有符号数乘法指令。基本与MUL相同。 DIV 操作数:被除数是在AX(除数8位)或者DX和AX(除数16位),操作数不能是立即数。如果除数是0,或者在8(16)位除数时商超过8(16)位,则认为是溢出,引起0号中断。IDIV:有符号除法指令,当除数为0,活着商太大,太小(字节超过127,-127字超过32767,-32767)时,引起0号中断。 符号扩展指令 CBW,CWD:把AL中的符号扩展到寄存器AH中,不影响各标志位。CWD则把AX中的符号扩展到DX,同样不影响标志位。注意:在无符号数除之前,不宜用这两条指令,一般采用XOR 清高8位或高16位。 逻辑运算指令与位移指令 注意:只能有一个存储器操作数;只有通用寄存器或存储器操作数可作为目的操作数,用于存放结果;操作数的类型必须一致。 NOT:取反,不影响标志位。 AND 操作数1 操作数2:操作结果送错作数1,标志CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志) SF(符号)反映运算结果,AF(辅助进位)未定义。自己与自己AND值不变,她主要用于将操作数中与1相与的位保持不变,与0相与清0。(都为1时为1)OR 操作数1 操作数2:自己与自己OR值不变,CF(进位)、OF(溢出)清0,PF(奇偶)ZF(0标志)SF(符号)反映运算结果,AF(辅助进位)未定义。她使用于将若干位置1:

汇编语言指令分类详解

3.1 8086/8088寻址方式 计算机中的指令由操作码字段和操作数字段组成。 操作码:指计算机所要执行的操作,或称为指出操作类型,是一种助记符。 操作数:指在指令执行操作的过程中所需要的操作数。该字段除可以是操作数本身外,也可以是操作数地址或是地址的一部分,还可以是指向操作数地址的指针或其它有关操作数的信息。 寻址方式就是指令中用于说明操作数所在地址的方法,或者说是寻找操作数有效地址的方法。8086/8088的基本寻址方式有六种。 1.立即寻址 所提供的操作数直接包含在指令中。它紧跟在 操作码的后面,与操作码一起放在代码段区域中。 如图所示。 例如:MOV AX,3000H 立即数可以是8位的,也可以是16位的。若 是16位的,则存储时低位在前,高位在后。 立即寻址主要用来给寄存器或存储器赋初值。 2.直接寻址 操作数地址的16位偏移量直接包含在指令中。它与操作码—起存放在代码段区域,操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位地址偏移量。如图2-2所示。 例如:MOV AX,DS:[2000H];

图2-2 (对DS来讲可以省略成MOV AX,[2000H],系统默认为数据段)这种寻址方法是以数据段的地址为基础,可在多达64KB的范围内寻找操作数。 8086/8088中允许段超越,即还允许操作数在以代码段、堆栈段或附加段为基准的区域中。此时只要在指令中指明是段超越的,则16位地址偏移量可以与CS或SS或ES相加,作为操作数的地址。 MOV AX,[2000H] ;数据段 MOV BX,ES:[3000H] ;段超越,操作数在附加段 即绝对地址=(ES)*16+3000H 3.寄存器寻址 操作数包含在CPU的内部寄存器中,如寄存器AX、BX、CX、DX等。 例如:MOV DS,AX MOV AL,BH 4.寄存器间接寻址 操作数是在存储器中,但是,操作数地址的16位偏移量包含在以下四个寄存器SI、DI、BP、BX之一中。可以 分成两种情况: (1)以SI、DI、BX间接寻址,则 通常操作数在现行数据段区域 中,即数据段寄存器(DS)*16 加上SI、DI、BX中的16位偏移 量,为操作数的地址, 例如:MOV AX,[SI] 操作数地址是:(DS)*16+(SI) (2)以寄存器BP间接寻址,则操作数在堆栈段区域中。即堆栈段寄存器(SS)*16与BP的内容相加作为操作数的地址, 例如:MOV AX,[BP] 操作数地址是:(SS)*16+(BP)若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成操作数地址。 例如:MOV AX,DS:[BP] 操作数地址是:(DS)*16+(BP)5.变址寻址 由指定的寄存器内容,加上指令中给出的8位或16位偏移量(当然要由一个

汇编与接口第四章作业

1.伪指令语句与硬指令语句的本质区别是什么?伪指令语句有什么主要作用? 答:区别:伪指令语句是能执行的语句,硬指令语句是CPU可以执行的语句。 伪指令语句主要作用是为汇编程序提供解释说明,它仅仅是在汇编过程中告诉汇编程序如果进行汇编。 2.什么是标识符?汇编程序中标识符怎样组成? 答:是用户自己定义的符号名。在汇编程序中标识符有两种:标号标识符,用在指令语句中,后面跟冒号,表示程序入口的逻辑地址。符号(或名字)标识符,用在伪指令语句中,后面不跟冒号,通常是定义一个变量,或说明变量类型。标识符一般不超31个字符,数字及常规符号($、@、?等)不能打头,也不能使用保留字。标识不区分大小写。 4.汇编语句有哪两种,每个语句有哪4部分组成? 答:指令语句(又称执行语句)和伪指令语句(又称说明性语句)。指令语句4部分包括,①标号:、②硬指令助记符、③操作数、④;注释。伪指令语句4部分包括,①符号名、②伪指令助记符、③参数、④;注释。 5.汇编程序开发有哪4个步骤?分别利用什么程序完成,产生什么输出文件? 答:①编辑。使用文本编辑器。产生汇编源程序文件: 文件名.ASM。源文件是文本文件。 ②汇编。使用汇编程序,如MASM或ML,排除程序中的语法错误。产生目标文件:文件名.OBJ。目标文件是二进制文件,是不能执行的文件。 ③连接。使用LINK。产生可执行文件:文件名.EXE. ④调试。使用DEBUG。本身不产生文件,是对连接产生的可执行进行调试,排除程序中的算法错误,保证可执行文件的正确性。 7.假设MYWORD是一个字变量,MYBYTE1和MYBYTE2是两个字节变量,指出下列语句中的错误原因。 (1) MOV BYTE PTR[BX], 1000 答:数据类型不匹配,目的地址单元是字节单元,1000大于255。无法存放。 (2) MOV BX, OFFSET[SI] 答:OFFSET后只能跟标识符。 (3) CMP MYBYTE1, MYBYTE2 答:CMP的两个操作数不能同时在存储器中。 (4) MOV AL, MYBYTE1+MYBYTE2 答:运算符只能对常数进行操作,不能对变量进行操作。 (5) SUB AL, MYWORD 答:数据类型不匹配,AL是8位的,MYWORD是16位变量。 (6) JNZ MYWORD 答:MYWORD是变量,其指的单元中存放的是操作数,不能用做跳转入口。 8.OPRL是个常数,请问下列语句中两个AND操作有什么不同? AND AL, OPRL AND 0FEH 答:第一个AND是指令语句,在程序运行时才执行,第二个AND是逻辑运算符,

汇编语言的各条指令

常用命令 数据传送指令 一通用数据传送指令 MOV指令为双操作数指令,两个操作数中不能全为内存操作数 格式:MOV DST,SRC 执行操作:dst = src 注:1.目的数可以是通用寄存器,存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以“后进先出”的方式进行数据操作。 格式:PUSH SRC //Word 执行操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) 注:1.入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器。

2.入栈时高位字节先入栈,低位字节后入栈。 格式:POP DST //Word 执行操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 注:1.出栈操作数除不允许用立即数和CS段寄存器外,可以为通用寄存器,段寄存器和存储器。 2.执行POP SS指令后,堆栈区在存储区的位置要改变。 3.执行POP SP 指令后,栈顶的位置要改变。 XCHG(eXCHanG)交换指令: 将两操作数值交换。 格式:XCHG OPR1,OPR2 //Byte/Word 执行的操作:(OPR1)<-->(OPR2) 注:1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 存储器与存储器之间不能交换数据。 二累加器专用传送指令 IN输入指令 长格式为:IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:(AL)<-(PORT)(字节)

8088汇编语言指令

8088指令系统总结 预备知识:符号含意、数据传送原则 符号含意 符号含意 opr 操作数 src 源操作数 dst 目的操作数 mem 存储器 im 立即数 seg 段寄存器 reg 通用寄存器 EA 偏移地址 PA 物理地址 nn直接地址DISP8:8位偏移地址DISP16:16位偏移地址 数据传送原则 口诀数据传送原则 寄段储间互传数,seg、reg、mem之间的数据可以相互传送。 立即只入寄和储。im可入reg、mem 只有寄间互换数,reg之间的数据可以传送。Mem间、seg间不可自传CS立即不可目,CS和立即数不可入,不能当目的操作数 8088指令系统 8088指令系统分六大类 一、数据传送指令 二、算术运算指令 三、逻辑运算与位移指令 四、串操作指令 五、控制与转移指令 六、CPU控制指令 一、数据传送指令 1.通用传送指令 (1)传送指令MOV dst, src功能:dst←src (2)堆栈操作指令人W PUSH src作用:SP←SP-2 ((SP+1)+SP)←src src(reg seg mem) POP dst 作用:dst←((SP+1)+SP)SP←SP-2 dst(reg seg mem)

(3)交换指令XCHG OPR1,OPR2 OPR1←→OPR2 2.累加器传送指令 (1)输入输出指令 256B短格式:直接寻址,64K长格式:直接、间接寻址,PORT为8位口地址输入指令:直接寻址IN AX,PORT IN AL,PORT 间接寻址IN AX,DX IN AL,DX 输出指令:直接寻址OUT AX,PORT OUT AL,PORT 间接寻址OUT AX,DX OUT AL,DX (2)换码指令XLAT AL←(BX+AL)(BX)为mem地址 3.地址传送指令 (1)有效地址传送寄存器 LEA reg16, mem作用:mem的EA→reg16 (2)指针送寄存器和DS指令 LDS reg16, mem32 作用:reg16←mem32的低字高字→DS (3)指针送寄存器和有ES指令 LES reg16, mem32 作用:reg16←mem32的低字高字→ES 4.标志寄存器传送指令 (1)取标志指令:LAHF F的低字节→AH (2)置标志指令:SAHF AH→flag的低字节 (3)标志入栈指令:PUSHF SP-2→SP F→(SP+1):SP (4)标志出栈指令:POPF (SP+1):SP→F SP+2→SP 二、算术运算指令 1.加法类指令(Add)opr-reg mem B/W (1)不带进位加法ADD dst, src dst←dst+src 影响OSZAPC (2)带进位加法ADC dst, src dst←dst+src+CF影响OSZAPC (3)加1指令INC opr opr←opr+1影响OSZP (4)组合十进制调整DAA放在ADD后 (5)非组合十进制调整AAA放在ADC后 原理:2个十进制数相加,可能出现非法数(A到F),需用调整指令,进行加6调整变成合法十进制数。十进制=BCD组合=压缩组合BCD占4位非组合BCD占8位 2 . 减法类指令(substract) (1)减法指令SUB dst, src;dst←dst-src影响标志位OSZAPC (2)带借位减法指令SBB dst, src;dst←dst-src-CF影响标志位

常见汇编语言指令解释:

PC是一个16位的程序计数器。用于存放和指示下一条要执行的指令的地址。寻址范围达64KB。PC有自动加1功能,以实现程序的顺序执行。PC没有地址,是不可寻址的,无法用指令对它进行读写。但在执行转移、调用、返回等指令时能自动改变其内容,以改变程序的执行顺序。 参数代表的意义: 1、Rn 表示R0~R7中的一个 2、#data 表示8位的数值 00H~FFH 3、direct 表示8位的地址 00H~FFH(指的是内部RAM或SFR的地址) 4、@Ri 表示寄存器间接寻址只能是R0或者R1 5、@DPTR 表示数据指针间接寻址 6、bit 表示位地址 7、$ 表示当前地址 常见汇编语言指令解释: 寄存器寻址 MOV A,R1将R1中的数值赋予A 直接寻址 MOV A,3AH将地址3AH中的数值赋予A 立即寻址 MOV A,#3AH将3AH数值赋予A

寄存器间址 MOV A,@R0 将 R0中地址的数值赋予A 变址寻址 MOVC A,@A+DPTR以A中的数值为地址偏移量进行查表 相对寻址 AJMP MATN跳转到行号为MATN处 位寻址 MOV C,7FH 将位地址7FH的数值赋予C MOV A,#3AH数据传输、赋值命令 PUSH direct将direct为地址的数值压入堆栈中 POP direct将direct为地址的数值弹出堆栈 XCH A,direct将direct中的数值与A进行交换 ADD A,direct将direct中的数值与 INC direct将direct中的数值加1 SUBB A,direct将A中的数值减去direct中的数值和Cy值,并保存在A中,如果想使用不带Cy减法,可以在运算前对Cy清零:CLR C DEC direct将direct中的数值减1 DA A 用于对BCD码加减法后进行10进制调整 MUL A B将A和B相乘,并把高八位放在B中,低八位放在A中 DIV A B将A和B相除,并把商放在A中,余数放在B中 ANL A,direct将A与direct中的数值进行与运算,结果保留在A 中(与运算规律:有0出0,全1出1) ORL A,direct将A与direct中的数值进行或运算,结果保留在A中(或运算规律:有1出1,全0出0) XRL A,direct将A与direct中的数值进行异或运算,结果保留在A 中(异或运算规律:全0出0,全1出0,01、10出1)

汇编语言的格式

5.2 汇编语言源程序的格式 在第四章介绍指令系统时曾给出若干程序举例,但是,它们仅仅是一些程序片段,并不是完整规范的汇编语言源程序。下而给出一个比较简单,然而比较规范的汇编语言源程序。例5.1要求将两个五字节16进制数相加,可以编写出以下汇编语言源程序。 DATA SEGMENT ;定义数据段DATA1 DB 0F8H,60H,0ACH,74H,3BH ;被加数 DATA2 DB 0C1H,36H,9EH,0D5H,20H ;加数 DATA ENDS ;数据段结束CODE SEGMMENT ;定义代码段 ASSUME CS:CODE,DS:DA TA START:MOV AX,DATA MOV DS,AX ;初始化DS MOV CX,5 ;循环次数送CX MOV SI,0;置SI初值为0 CLC;清CF标志LOOPER:MOV AL,DATA2[SI];取一个字节加数 ADC DA TA1[SI],AL;与被加数相加 INC SI;SI加1 DEC CX;CX减1 JNZ LOOPER;若不等于0,转LOOPER MOV AH,4CH INT21H;返回DOS CODE END;代码段结束 END START;源程序结束 5.2.1 分段结构 由上面的例子可以看出,汇编语言源程序的结构是分段结构形式,一个汇编语言源程序由若干段(SEGMENT)组成,每个段以SEGMENT语句开始,以ENDS语句结束。整个源程序的结尾是END语句。 这里所说的汇编语言源程序中的段与前面讨论的CPU管理的存储器的段,既有联系,又在概念上有所区别。我们已经知道,微处理器对存储器的管理是分段的,因而,在汇编语言程序中也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目标程序后,可以分别装入存储器的相应段中。但是,以8086/8088 CPU为例,它有四个段寄存器(CS,ES,SS和DS),因此CPU对存储器按照四个物理段进行管理,即数据段,附加段,堆栈段和代码段。任何时侯CPU只能访问四个物理段。而在汇编语言源程序中,设置段的自由度比较大。例如一个源程序中可以有多个数据段或多个代码段等等。一般来说,汇编语言源程序中段的数目可以根据实际需要而设定。为了和CPU管理的存储器物理段相区别,我们将汇编语言程序中的段称为逻辑段。在不致发生混淆的地方,有时简称为段。

汇编语言常用指令大全解释

常用汇编指令:MOV指令为双操作数指令,两个操作数中必须有一个是寄存器. MOV DST , SRC // Byte / Word 执行操作: dst = src 1.目的数可以是通用寄存器, 存储单元和段寄存器(但不允许用CS段寄存器). 2.立即数不能直接送段寄存器 3.不允许在两个存储单元直接传送数据 4.不允许在两个段寄存器间直接传送信息 PUSH入栈指令及POP出栈指令: 堆栈操作是以"后进先出"的方式进行数据操作. PUSH SRC //Word 入栈的操作数除不允许用立即数外,可以为通用寄存器,段寄存器(全部)和存储器. 入栈时高位字节先入栈,低位字节后入栈. POP DST //Word 出栈操作数除不允许用立即数和CS段寄存器外, 可以为通用寄存器,段寄存器和存储器. 执行POP SS指令后,堆栈区在存储区的位置要改变. 执行POP SP 指令后,栈顶的位置要改变. XCHG(eXCHanG)交换指令: 将两操作数值交换. XCHG OPR1, OPR2 //Byte/Word 执行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必须有一个操作数是在寄存器中 2.不能与段寄存器交换数据 3.存储器与存储器之间不能交换数据. XLAT(TRANSLATE)换码指令: 把一种代码转换为另一种代码. XLAT (OPR 可选) //Byte 执行操作: AL=(BX+AL) 指令执行时只使用预先已存入BX中的表格首地址,执行后,AL中内容则是所要转换的代码. LEA(Load Effective Address) 有效地址传送寄存器指令 LEA REG , SRC //指令把源操作数SRC的有效地址送到指定的寄存器中. 执行操作: REG = EAsrc 注: SRC只能是各种寻址方式的存储器操作数,REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等价于LEA BX , OPER_ONE MOV SP , [BX] //将BX间接寻址的相继的二个存储单元的内容送入SP中 LEA SP , [BX] //将BX的内容作为存储器有效地址送入SP中 LDS(Load DS with pointer)指针送寄存器和DS指令 LDS REG , SRC //常指定SI寄存器。 执行操作: REG=(SRC), DS=(SRC+2) //将SRC指出的前二个存储单元的内容送入指令中指定的寄存器中,后二个存储单元送入DS段寄存器中。 LES (Load ES with pointer) 指针送寄存器和ES指令 LES REG , SRC //常指定DI寄存器 执行操作: REG=(SRC) , ES=(SRC+2) //与LDS大致相同,不同之处是将ES代替DS而已. LAHF( Load AH with Flags ) 标志位送AH指令

相关文档
最新文档