8086伪指令
汇编80X86伪指令系统
80X86伪指令系统一.伪指令概述构成汇编语言程序的语句可以分为三种:指令性语句(指令语句)、指示性语句(伪指令语句)和指令语句(宏调用语句)。
指令语句,又称可执行语句,表示计算机具有的一个基本能力。
比如数据传送,数据相加、相减等。
伪指令语句,又称命令语句,告诉汇编程序如何对程序进行汇编。
比如段定义、储存单元分配等。
一个汇编语言程序经汇编,连接和装入内存后,在执行程序之前:1.指示性语句的功能已经完成,故又称伪操作。
2.指令性语句的功能尚未完成,需控制CPU去执行,才能完成。
二、伪指令详解符号定义语句1.等值语句格式:符号名EQU 需等值的表达式功能:用符号名等值指定的表达式;其中表达式可以是任何有效的操作数,汇编时用语句中的表达式代替程序中符号所在的地方。
说明:▲可用于定义符号常量,方便修改程序。
▲某表达式多次出现时,用等值伪操作可以方便编程。
▲等值语句表达式的种类(1)常数或数值表达式COUNT EQU 10NUM EQU 89*3+5-9(2)地址表达式ADD1 EQU V AR2+10H(3)变量或标号CON EQU V AR▲在EQU语句右边出现的标号需在EQU语句以前进行定义。
2.等号语句格式:符号=需等值的表达式功能:把等号“=”右边表达式的值或符号赋给等号“=”左边的符号。
表达式可以是任何有效的操作数。
说明:EQU语句与“=”的区别:在同一源程序中,EQU语句定义的符号不能被重新赋值或者说不能被重新定义,同一符号只能定义一次,符号的数值不能被改变。
“=”定义的符号可以被重新赋值,同一符号的数值在同一个程序中可以改变。
数据定义语句格式:变量名类型助记符操作数[ ,操作数, ……]功能:用于在内存中为常数、初始数据或者变量分配储存单元。
说明:(1)变量名指示内存操作数所占用的内存单元地址(符号地址),在程序中,可以通过变量,名对内存单元进行访问。
变量名为用户自定义标识符,表示初值表首元素的逻辑地址。
8086汇编语言
DATA_WORD DW 100, 100H
DATA_BYTE DB 100 DUP (?)
MESS1
DB ‘AB’
MESS2
DW ‘AB’
例: OPER1 DB 1, 2 OPER2 DW 1234H, 5678H … MOV AX, WORD PTR [ OPER1+1] MOV AL, BYTE PTR [OPER2]
伪指令--供汇编过程的20种伪操作。 3、操作数 (1)常数类:
二、八、十、十六进制、科学表示法、字符串等
(2)变量(标号):所有的变量和标号都有三种属性
段值(SEG) 偏移量(OFFSET) 类型(TYPE):变量(BYTE/WORD/DWORD)
标号(NEAR / FAR)
(3)表达式
A、算术操作符: , , ,
AX=3402H AL=34H
OPER1 01 02
OPER2 34 12 78 56
低地址 高地址
三、段定义伪操作
格式: 段名 SEGMENT [定位类型, 组合类型, 类别]
……
段名 ENDS 例:定义用户堆栈
stack segment qqq dw 40H dup (?) stack ends code segment
start: mov ax, data1
mov ds, ax
mov ax, data2
mov es, ax
; 段地址段寄存器
…
code ends
end start
四、程序开始和结束伪操作 ORG 常数表达式 ;使下一地址是常数表达式的值 ORG 100H START: …...
END [程序首地址标号] 五、过程定义 PROC
8086汇编语言伪指令
一、伪指令详解伪指令在百度百科中的定义为:伪指令(Pseudo Instruction)是用于对汇编过程进行控制的指令,该类指令并不是可执行指令,没有机器代码,只用于汇编过程中为汇编程序提供汇编信息。
例如,提供如下信息:哪些是指令、哪些是数据及数据的字长、程序的起始地址和结束地址等。
伪指令有2个特点:1.由于是伪“指令”,因而它只存在于汇编语言中。
高级语言中不叫指令,叫语句;2.由于是“伪”指令,也即“假”指令,因而不是可执行指令,不会产生机器代码,不会占用ROM空间,只用于汇编过程中为汇编程序提供汇编信息。
与指令的区别::1.指令是在执行阶段发挥作用的,由CPU(Intel、AMD等)来执行。
2.伪指令是在编译阶段发挥作用的,由汇编器(MASM、TASM等)来解释。
二、数据定义伪指令为源程序中的数据和堆栈区分配数据存储单时,使用最多的伪指令。
数据定义伪指令格式如下:常用的数据定义伪指令类型有:∙DB(定义字节,常用)一个字节数据占1个字节单元,读完一个,偏移量加1∙DW(定义字,常用)一个字数据占2个字节单元,读完一个,偏移量加2∙DD(定义双字)一个双字数据占4个字节单元,读完一个,偏移量加4∙DQ(定义四字)一个四字数据占8个字节单元,读完一个,偏移量加8∙DT(定义十字节,用于BCD码)数据定义伪指令后面的初值表可以是常数、表达式、字符串。
例如:D2DW110*230;为D2分配1个字,存放表达式的值D3DB‘GOOD!’;为D3分配5字节,用来存放字符串‘GOOD!’D4DD2.4E+3;为D4分配2个字,存放一个浮点数D5DB‘AB’;为D5分配2字节,字符A在低字节,B在高字节D6DW‘AB’;为D6分配1个字,字符A在高字节,B在低字节S1DB5DUP(?);为S1预留5字节的存储空间S2DW3DUP(0);为S2分配3个字,初值设为0语句1相当于C语言中的DW D2=110*230,只不过是语法结构不太一样注意:通过变量名操作时,变量名代表存储区的第一个数据的地址。
8086汇编指令
HLT 处理器暂停, 直到出现中断或复位信号才继续. O MN|ea.O
WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. &ET PYf %#
ESC 转换到外处理器. Kl+4 A} Uo
LOCK 封锁总线. %'[ pucEF
NOP 空操作. bn"z&g
POPD 32位标志出栈. @A6 iY
二、算术运算指令 J 299 mgB
ADD 加法. (RI)<zaK ;
ADC 带进位加法. ~+ {*KPiD
INC 加 1. oO;L l? ~
AAA 加法的ASCII码调整. At@0G\^
DAA 加法的十进制调整. '| g sm O
STC 置进位标志位. y O?52YO
CLC 清进位标志位. *Ja,3Q q
CMC 进位标志取反. J~rjI 24
STD 置方向标志位. .2 ST Bh.;
CLD 清方向标志位. G X>T~i\f8
STI 置中断允许位. t M{U6 k
CLI 清中断允许位. z`rW2UO#a`
JO 溢出转移. PW -s F
JP/JPE 奇偶性为偶数时转移. ,,V uv n
JS 符号位为 "1" 时转移. E J Ta ~
3>循环控制指令(短转移) aDX 4 }`u
LOOP CX不为零时循环. I, ?!N zB
LOOPE/LOOPZ CX不为零且标志Z=1时循环. ; 5!8LmZ0#
XADD 先交换再累加.( 结果在第一个操作数里 ) PK +sGV
8086常用指令表
8086/8088常用助记符指令类型助记符目的源功能注释数据传送MOV X X 把数据从源操作数传送到目的操作数1.两个操作数不能同时为内存操作数,也不能同时为立即数,目的操作数不能为立即数2两个操作数的类型须一致3立即数不能直接传入段寄存器4CS,IP不能作目的操作数5段寄存器之间不能直接传送PUSH X把指定的寄存器/内存单元的内容压入堆栈1.按字操作,CS能入栈内存不能直接寻址.P-2→SP,再写入栈顶POP X从栈顶弹出一字到指定的寄存器/内存单元1.同上2.先弹出一字,再SP-2→SP XCHG 寄寄/内两操作数互换内容不能用立即数和段寄存器XCHG 寄指定寄存器同累加器互换内容IN AC 端口号从指定端口送数到AL端口号为立即数,地址为8位端口号在DX中,地址为16位OUT 端口号 AL从AL送数到指定端口LEA 寄内存LDS 寄内存LES 寄内存把内存偏址送指定寄存器把内存低2字节送寄存器,高2字节送DS(ES)只能用通用寄存器,不能用段寄存器LAHF把标寄低8位送AHSAHF把AH送标寄低8位PUSHF标寄入栈POPF栈顶弹出进标寄算术运算ADD X X加法(和送目的操作数)加减1.2.同MOV3.段寄存器不能作操作数4.调正在AL中进行,并必需紧跟在运算之后执行.5.比较运算同减法,结果不存,而仅影响标志寄存器6.乘除法的目的操作数隐含是ACAL*乘数→AX, AX*乘数→DX AX,AX/除数→AL, 余数在AH中DXAX/除数→AX, 余数在DX中7.加1减1指令把操作数当无符号数,其他加减指令是否为有符号数要由程序设计需要设定ADC X X带进位加法INC X 指定的寄/内的内容加1AAA分离BCD码调正(AL)DAA组合BCD码调正(AL)SUB X X减法SBB X X带借位减法DEC X指定的寄/内的内容减1NEG X指定的寄/内的内容求补CMP X X 比较AAS分离BCD码调正(AL)DAS组合BCD码调正(AL)MUL 寄/内不带符号乘法IMUL 寄/内带符号整数乘法AAM 分离BCD码调正(AL)DIV 寄/内不带符号除法IDIV 寄/内带符号整数除法AAD非组合BCD码调正CBW扩展AL中的符号位到AHCWD扩展AX中的符号位到DX类型助记符目的源功能注释逻辑运算NOT X 对字或字节按位取反 1.2.3同上4.按位操作5.AND1不变(保持),AND0置0OR1置1,OR0不变(保持)自身与或,结果不变(保持),影响标志位, 自身XOR常用于清零XOR 1取反,XOR 0不变AND X X对字或字节按位与操作OR X X 对字或字节按位或操作XOR X X对字或字节按位异或操作TEST X X同AND,但结果仅影响标寄而不存目的操作数移位和循环移位SHL 寄/内 1/CL按位左移 CF←M←0 1.循环或移位的次数为1或CL中的数2.SHL一次,原数乘2SHR一次,原数除23.目的操作数不能是立既数SAL 寄/内 1/CL按位左移 CF←M←0SHR 寄/内 1/CL逻辑右移 0→M→CFSAR 寄/内 1/CL算术右移→M→CFROL 寄/内 1/CL循环左移 CF← ←M ←ROR 寄/内 1/CL循环右移 CF← →M →RCL 寄/内 1/CL带进位循环左移←CF←M←RCR 寄/内 1/CL带进位循环右移→CF→M→重复前缀REP重复后面字串指令,直到CX=0一般与字串指令联合使用REPE/REPZ当相等/为零时重复REPNE/REPNZ当不相等/不为零时重复MOVSB/MOVSW字符串传送 1.源串偏址在SI中,目的串偏址在DI中.2.每次自动修改SI,DI 内容3.装入和存储是对AX(AL)操作CMPSB/CMPSW字符串比较SCASB/SCASW字符串扫描LODSB/LODSW字符串装入STOSB/STOSW字符串存储转移JMP X无条件转移到指定内存地址操作数前可带NEAR或FAR前缀条件转移(无符号数)JA/JNBE X高于/不低于,不等于由比较和减法指令的结果JA/JNBE 表示二者等价JAE/JNB X大于等于/不低于JB/JNAE X低于/不高于,不等于TBE/JNA X低于等于/不高于条件转移(带符号数)JG/JNLE X大于/不小于等于JGE/JNL X大于等于/不小于JL/JNGE X小于/不大于不等于JLE/JNG X小于等于/不大于条件转移JE/JZ X等于/为零JNE/JNZ X不等于/不为零条件转移JC/JNC X有进位CF=1/无进位CF=0由影响标志位的操作结果JC/JNC表示二者是两个不同用法JO/JNO X有溢出OF=1/无溢出OF=0JP/JPE X奇偶性为偶PF=1JNP/JPO X奇偶性为奇PF=0JS/JNS X符号位为1/符号位为0FR15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF 溢出方向符号零半进位奇偶进位类型助记符目的源功能注释LOOP X[CX]-1→[CX],[CX]≠0转移到X由CX决定循环次数循环LOOPZ/LOOPE X [CX]-1→[CX],[CX]≠0且ZF=1转移到X为零/相等时循环LOOPNZ/LOOPNE X[CX]-1→[CX],[CX]≠0且ZF=0转移到X非零/不相等时循环JCXZ X [CX]=0转移到X调用返回CALL 过程名调用指定地址开始的子程序对标寄无影响注意用堆栈保护断点RET子程返回RET XRETF标志操作CLC CF=0 (进位)STC CF=1CMC CF取反CLD DF=0 (方向)STD DF=1CLI IF=0 (中断)STI IF=1HLT暂停ESC交权INT 21H DOS功能调用AH=1键盘输入到AL,AH=2显示DL内容,AH=9显示DX为偏移量以$结尾的内存字串NOP空操作3个时钟伪指令功能特征符号 EQU 符号/表达式把右边的值赋予左边的符号1.不产生目标代码,不分配内存单元2.在同一源程序中同一符号不能用EQU重定义,可用=重定义符号=符号/表达式变量名 DB 表达式1,表达式2…. DWDD 定义字节(或字、双字)1.要求汇编分配内存单元,并把表达式1,表达式2…等存入2.为变量名分配这些内存单元的首字节地址段名SEGMENT [定位] [组合]['类别名'] :段名 ENDS 定义逻辑段定位隐含PARA,表示能被16整除ASSUME 段寄名:段名,段寄名:段名,….告诉汇编已定义的段与段寄的关系不产生目标代码,不分配内存单元,不为段寄存器存放段基值过程名 PROC [NEAR/FAR]:RET过程名 ENDP构造子程序最后语句RET不能少ORG 表达式定义下一个数据或指令的偏移量$表示偏移量的现行值宏名 MACRO 形参1,形参2,….ENDM宏定义宏名实参1,实参2,….宏调用一.指令由名字,操作码、操作数(地址)组成。
第4章-8086汇编语言程序设计(1)汇编语言的语句-伪指令-运算符-DOS功能调用
注意:ASSUME只是告知汇编程序有关段寄存器与段的关系, 并没有给段寄存器赋予实际的初值。
ORG规定了段内的起始地址或偏移地址。 格式: ORG <表达式> 表达式的值即为段内的起始地址或偏移地址,从此地址起连续 存放程序或数据。
四、过程定义语句 格式:过程名 PROC [NEAR]或FAR ┇ RET ┇ 过程名 ENDP
例1: MOV AX,SEG STRI1 MOV DS,AX 将变量STRI1所在段值取到DS中
例2: MOV SI,OFFSET STRI1 代表将变量STRI1处的地址偏移量取到SI中.
注意:它与 LEA SI,STRI1类似。 TYPE,SIZE、LENGTH (不作要求).
#3
5. 类型操作符PTR
新存储器地址。
2. 逻辑运算符(不作要求) AND、OR、XOR、NOT,只能用于数字表达式中。
3. 关系运算符(不作要求) EQ(相等)、NE(不等)、LT(小于)、GT(大于)、 LE(小于或等于)、GE(大于或等于)
4. 分析操作符 SEG,OFFSET,TYPE,SIZE、LENGTH。可以把存储器 一些特征作为数值送回。
IMUL AL SUB AX,BX MOV D,AX MOV AH,4CH
INT 21H
CODE ENDS
END START
➢ 一个源程序通常由若干个段组成,每个段均以SEGMENT开 始,以ENDS结束。
➢ 每个段包含若干语句,分指令语句与伪指令语句两种。
➢ 每条语句可由标识符、保留字、表达式等元素组成。
DATA ENDS
STACK SEGMENT DB 20H DUP(?)
8086-汇编指令集
8086 汇编指令集一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.1. 通用数据传送指令MOV 传送字或字节.格式为: MOV DST,SRC执行的操作:(DST)<-(SRC)MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.格式为:PUSH SRC执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC)POP 把字弹出堆栈.格式为:POP DST执行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI 依次压入堆栈.POPA 把DI,SI,BP,SP,BX,DX,CX,AX 依次弹出堆栈.PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI 依次压入堆栈.POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX 依次弹出堆栈.BSWAP 交换32 位寄存器里字节的顺序XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)格式为:XCHG OPR1,OPR2执行的操作:(OPR1)<-->(OPR2)CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD 先交换再累加.( 结果在第一个操作数里)2. 输入输出端口传送指令.IN I/O 端口输入. ( 语法: IN 累加器,{端口号│DX} )长格式为:IN AL,PORT(字节)IN AX,PORT(字)执行的操作:(AL)<-(PORT)(字节)(AX)<-(PORT+1,PORT)(字)短格式为:IN AL,DX(字节)IN AX,DX(字)执行的操作: AL<-((DX))(字节)AX<-((DX)+1,DX)(字)OUT I/O 端口输出. ( 语法: OUT {端口号│DX},累加器),输入输出端口由立即方式指定时,其范围是0-255;由寄存器DX 指定时,其范围是0-65535.长格式为: OUT PORT,AL(字节)OUT PORT,AX(字)执行的操作: (PORT)<-(AL)(字节)(PORT+1,PORT)<-(AX)(字)短格式为: OUT DX,AL(字节)OUT DX,AX(字)执行的操作: ((DX))<-(AL)(字节)((DX)+1,(DX))<-AX(字)XLAT 换码指令字节查表转换,BX 指向一张256 字节的表的起点,AL 为表的索引值(0-255,即0-FFH);返回AL 为查表结果. 执行的操作: ( [BX+AL]->AL )格式为: XLAT OPR或: XLAT3. 目的地址传送指令.LEA 装入有效地址. 格式为: LEA REG,SRC执行的操作:(REG)<-SRC指令把源操作数的有效地址送到指定的寄存器中.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.格式为: LDS REG,SRC执行的操作:(REG)<-(SRC) (DS)<-(SRC+2)把源操作数指定的 4 个相继字节送到由指令指定的寄存器及DS 寄存器中.该指令常指定SI寄存器.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.格式为: LES REG,SRC执行的操作: (REG)<-(SRC) (ES)<-(SRC+2)把源操作数指定的 4 个相继字节送到由指令指定的寄存器及ES 寄存器中.该指令常指定DI寄存器.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF 标志寄存器传送,把标志装入AH.格式为: LAHF执行的操作:(AH)<-(PWS 的低字节)SAHF 标志寄存器传送,把AH 内容装入标志寄存器.格式为: SAHF执行的操作:(PWS 的低字节)<-(AH)PUSHF 标志入栈.格式为: PUSHF执行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)POPF 标志出栈.格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP)) (SP)<-(SP+2)PUSHD 32 位标志入栈.POPD 32 位标志出栈.二、算术运算指令ADD 加法.格式: ADD DST,SRC执行的操作:(DST)<-(SRC)+(DST)ADC 带进位加法.格式: ADC DST,SRC执行的操作:(DST)<-(SRC)+(DST)+CFINC 加1.格式: INC OPR执行的操作:(OPR)<-(OPR)+1AAA 加法的ASCII 码调整.DAA 加法的十进制调整.SUB 减法.格式: SUB DST,SRC执行的操作:(DST)<-(DST)-(SRC)SBB 带借位减法.格式: SBB DST,SRC执行的操作:(DST)<-(DST)-(SRC)-CFDEC 减1.格式: DEC OPR执行的操作:(OPR)<-(OPR)-1NEC 求反(以0 减之).格式: NEG OPR执行的操作:(OPR)<--(OPR)CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).格式: CMP OPR1,OPR2执行的操作:(OPR1)-(OPR2)该指令与SUB 指令一样执行减法操作,但不保存结果,只是根据结果设置条件标志. AAS 减法的ASCII 码调整.DAS 减法的十进制调整.MUL 无符号乘法.格式: MUL SRC执行的操作:字节操作数:(AX)<-(AL)*(SRC)字操作数:(DX,AX)<-(AX)*(SRC)IMUL 整数乘法.格式: IMUL SRC执行的操作:与MUL 相同,但必须是带符号数,而MUL 是无符号数.以上两条,结果回送AH 和AL(字节运算),或DX 和AX(字运算),AAM 乘法的ASCII 码调整.DIV 无符号除法.非组合BCD 码乘法调整指令格式: DIV SRC执行的操作:字节操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余数字操作: (AX)<-(DX,AX)/(SRC)的商(AX)<-(DX,AX)/(SRC)的余数IDIV 整数除法.格式: DIV SRC执行的操作:与DIV 相同,但操作数必须是带符号数,商和余数也均为带符号数,且余数的符号与被除数的符号相同.以上两条,结果回送:商回送AL,余数回送AH,(字节运算);或商回送AX,余数回送DX,(字运算).AAD 除法的ASCII 码调整.非组合BCD 码除法调整指令CBW 字节转换为字. (把AL 中字节的符号扩展到AH 中去)格式: CBW执行的操作:AL 的内容符号扩展到AH.即如果(AL)的最高有效位为0,则(AH)=00;如(AL)的最高有效位为1,则(AH)=0FFHCWD 字转换为双字. (把AX 中的字的符号扩展到DX 中去)格式: CWD执行的操作:AX 的内容符号扩展到DX.即如(AX)的最高有效位为0,则(DX)=0;否则(DX)=0FFFFH.这两条指令都不影响条件码.CWDE 字转换为双字. (把AX 中的字符号扩展到EAX 中去)CDQ 双字扩展. (把EAX 中的字的符号扩展到EDX 中去)三、逻辑运算指令AND 与运算.格式: AND DST,SRC执行的操作:(DST)<-(DST)^(SRC)OR 或运算.格式: OR DST,SRC执行的操作:(DST)<-(DST)V(SRC)XOR 异或运算.格式: XOR DST,SRC执行的操作:(DST)<-(DST)V(SRC)NOT 取反.格式: NOT OPR执行的操作:(OPR)<-(OPR)TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).格式: TEST OPR1,OPR2执行的操作:(DST)^(SRC)两个操作数相与的结果不保存,只根据其特征置条件码SHL 逻辑左移.格式: SHL OPR,CNT(其余的类似)其中OPR 可以是除立即数以外的任何寻址方式.移位次数由CNT 决定,CNT 可以是 1 或CL.SAL 算术左移.(=SHL)SHR 逻辑右移.SAR 算术右移.(=SHR)ROL 循环左移.ROR 循环右移.RCL 通过进位的循环左移.RCR 通过进位的循环右移.以上八种移位指令,其移位次数可达255 次.移位一次时,可直接用操作码. 如SHL AX,1.移位>1 次时,则由寄存器CL 给出移位次数.如MOV CL,04SHL AX,CL四、串指令DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D 标志0 表示重复操作中SI 和DI 应自动增量;1 表示应自动减量.Z 标志用来控制扫描或比较操作的结束.MOVS 串传送.格式:可有三种MOVS DST,SRCMOVSB(字节)MOVSW(字)其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]执行的操作:1)((DI))<-((SI))2)字节操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1当方向标志DF=0 时用+,当方向标志DF=1 时用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2当方向标志DF=0 时用+,当方向标志DF=1 时用-该指令不影响条件码.CMPS 串比较.格式: CMPS SRC,DSTCMPSBCMPSW执行的操作:1)((SI))-((DI))2)字节操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其它特性和MOVS 指令的规定相同.SCAS 串扫描.把AL 或AX 的内容与目标串作比较,比较结果反映在标志位.格式: SCAS DSTSCASBSCASW执行的操作:字节操作: (AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码.指令的其他特性和MOVS 的规定相同.LODS 装入串.把源串中的元素(字或字节)逐一装入AL 或AX 中.格式: LODS SRCLODSBLODSW执行的操作:字节操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2该指令把由(SI)指定的数据段中某单元的内容送到AL 或AX 中,并根据方向标志及数据类型修改SI 的内容.指令允许使用段跨越前缀来指定非数据段的存储区.该指令也不影响条件码.一般说来,该指令不和REP 联用.有时缓冲区中的一串字符需要逐次取出来测试时,可使用本指令.STOS 保存串.是LODS 的逆过程.格式: STOS DSTSTOSB(字节)STOSW(字)执行的操作:字节操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2该指令把AL 或AX 的内容存入由(DI)指定的附加段的某单元中,并根据DF 的值及数据类型修改DI 的内容,当它与REP 联用时,可把AL 或AX 的内容存入一个长度为(CX)的缓冲区中.REP 当CX/ECX<>0 时重复.格式: REP string primitive其中String Primitive 可为MOVS,LODS 或STOS 指令执行的操作:1)如(CX)=0 则退出REP,否则往下执行.2)(CX)<-(CX)-13)执行其中的串操作4)重复1)~3)REPE/REPZ 当ZF=1 或比较结果相等,且CX/ECX<>0 时重复.格式: REPE(或REPZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令.执行的操作:1)如(CX)=0 或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行2)(CX)<-(CX)-13)执行其后的串指令4)重复1)~3)REPNE/REPNZ 当ZF=0 或比较结果不相等,且CX/ECX<>0 时重复.格式: REPNE(或REPNZ) String Primitive其中String Primitive 可为CMPS 或SCAS 指令执行的操作:除退出条件(CX=0)或ZF=1 外,其他操作与REPE 完全相同.REPC 当CF=1 且CX/ECX<>0 时重复.REPNC 当CF=0 且CX/ECX<>0 时重复.五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令1)段内直接短转移格式:JMP SHORT OPR执行的操作:(IP)<-(IP)+8 位位移量2)段内直接近转移格式:JMP NEAR PTR OPR执行的操作:(IP)<-(IP)+16 位位移量3)段内间接转移格式:JMP WORD PTR OPR执行的操作:(IP)<-(EA)4)段间直接(远)转移格式:JMP FAR PTR OPR执行的操作:(IP)<-OPR 的段内偏移地址(CS)<-OPR 所在段的段地址5)段间间接转移格式:JMP DWORD PTR OPR执行的操作:(IP)<-(EA) (CS)<-(EA+2)2>条件转移指令(短转移,-128 到+127 的距离内)1)根据单个条件标志的设置情况转移JZ(或JE)(Jump if zero,or equal) 结果为零(或相等)则转移格式:JE(或JZ) OPR测试条件:ZF=1JNZ(或JNE)(Jump if not zero,or not equal) 结果不为零(或不相等)则转移格式:JNZ(或JNE) OPR测试条件:ZF=0JS(Jump if sign) 结果为负则转移格式: JS OPR测试条件:SF=1JNS(Jump if not sign) 结果为正则转移格式:JNS OPR测试条件:SF=0JO(Jump if overflow) 溢出则转移格式: JO OPR测试条件:OF=1JNO(Jump if not overflow) 不溢出则转移格式: JNO OPR测试条件:OF=0JP(或JPE)(Jump if parity,or parity even) 奇偶位为1 则转移格式: JP OPR测试条件:PF=1JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位为0 则转移格式: JNP(或JPO) OPR测试条件:PF=0JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或进位位为1 则转移格式:JB(或JNAE,JC) OPR测试条件:CF=1JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或进位位为0 则转移格式:JNB(或JAE,JNC) OPR测试条件:CF=02)比较两个无符号数,并根据比较的结果转移JB(或JNAE,JC)格式:同上JNB(或JAE,JNC)格式:同上JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于则转移格式:JBE(或JNA) OPR测试条件:CFVZF=1JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于则转移格式:JNBE(或JA) OPR测试条件:CFVZF=03)比较两个带符号数,并根据比较的结果转移JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于则转移格式:JL(或JNGE) OPR测试条件:SFVOF=1JNL(或JGE)(Jump if not less,or greater or equal)不小于, 或者大于或者等于则转移格式:JNL(或JGE) OPR测试条件:SFVOF=0JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于则转移格式:JLE(或JNG) OPR测试条件:(SFVOF)VZF=1JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于则转移格式:JNLE(或JG) OPR测试条件:(SFVOF)VZF=04)测试CX 的值为0 则转移指令JCXZ(Jump if CX register is zero) CX 寄存器的内容为零则转移格式:JCXZ OPR测试条件:(CX)=0注:条件转移全为8 位短跳!3>循环控制指令(短转移)LOOP CX 不为零时循环.格式: LOOP OPR测试条件:(CX)<>0LOOPE/LOOPZ CX 不为零且标志Z=1 时循环.格式: LOOPZ(或LOOPE) OPR测试条件:(CX)<>0 且ZF=1LOOPNE/LOOPNZ CX 不为零且标志Z=0 时循环.格式: LOOPNZ(或LOOPNE) OPR测试条件:(CX)<>0 且ZF=0这三条指令的步骤是:1)(CX)<-(CX)-12)检查是否满足测试条件,如满足则(IP)<-(IP)+D8 的符号扩充.JCXZ CX 为零时转移.JECXZ ECX 为零时转移.4>子程序CALL 调用指令RET 返回指令5>中断指令INT 中断指令格式: INT TYPE或INT执行的操作: (SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2 ((SP)+1,(SP))<-(CS)(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP)(IP)<-(TYPE*4) (CS)<-(TYPE*4+2)INTO 溢出中断执行的操作:若OF=1 则:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2 ((SP)+1,(SP))<-(CS)(SP)<-(SP)-2 ((SP)+1,(SP))<-(IP)(IP)<-(10H) (CS)<-(12H)IRET 中断返回格式: IRET执行的操作: (IP)<-((SP)+1,(SP))(SP)<-(SP)+2(CS)<-((SP)+1,(SP))(SP)<-(SP)+2(PSW)<-((SP)+1,(SP))(SP)<-(SP)+2六、处理器控制指令1.标志处理指令CLC 进位位置0 指令(Clear carry)CF<-0CMC 进位位求反指令(Complement carry)CF<-CFSTC 进位位置1 指令(Set carry)CF<-1CLD 方向标志置0 指令(Clear direction)DF<-0STD 方向标志置1 指令(Set direction)DF<-1CLI 中断标志置0 指令(Clear interrupt)IF<-0STI 中断标志置1 指令(Set interrupt)IF<-02.其他处理机控制指令NOP 无操作指令该指令不执行任何操作,其机器码占有一个字节,在调试程序时往往用这条指令占有一定的存储单元,以便在正式运行时用其他指令取代.HLT 停机指令该指令可使机器暂停工作,使处理机处于停机状态以便等待一次外部中断到来,中断结束后可继续执行下面的程序.WAIT 等待指令该指令使处理机处于空转状态,它也可以用来等待外部中断的发生,但中断结束后仍返回WAIT 指令继续德行.ESC 换码指令格式ESC mem其中mem 指出一个存储单元,ESC 指令把该存储单元的内容送到数据总线去.当然ESC 指令不允许使用立即数和寄存器寻址方式.这条指令在使用协处理机(Coprocessor)执行某些操作时,可从存储器指得指令或操作数.协处理机(如8087)则是为了提高速度而可以选配的硬件.LOCK 封锁指令该指令是一种前缀,它可与其他指令联合,用来维持总线的锁存信号直到与其联合的指令执行完为止.当CPU 与其他处理机协同工作时,该指令可避免破坏有用信息.七、伪指令DW 定义字(2 字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.。
8086汇编语言语句的类型和格式
⑴ 算术运算符:+、-、*、/和取模运算。
⑵ 逻辑运算符:、、和。
⑶ 关系运算符:、、、、、。结果只有两个全 1或全0。
⑷ 分析运算符:利用分析运算符可以把一个存 储单元地址分解为段地址和偏移地址等。分析运算符 有 、 、、和等。
分析运算符表达式
带分析运算符的表达式
: ,2[] ;取一个字节加数 1 0F8H,60H,0,74H,3 ;被加数 第一条语句是指令语句,其中“:”是名字,“”是指令助记符, “,2[]”是操作数,“;”后面是注释部分;第二条语句是伪指 令语句,其中“1”是名字,“”是伪指令定义符,“0F8H, 60H,0,74H,3”是操作数,“;”后面是注释部分。
⑵ 定义变量的类型为,给变量分配字操作数。
⑶ 定义变量的类型为,给变量分配双字操作 数。
除了常数、表达式和字符串外,问号“?”也 可以作为数据定义伪指令的操作数,此时仅给变量保 留相应的存储单元,而不赋与变量某个确定的初值。
当同样的操作数重复多次时,可用重复操作符 “”表示,其形式为:
n (初值[,初值…0])
1) 名字
汇编语言语句的第一个组成部分是名字()。在指令语句 中,这个名字是一个标号。指令语句中的标号实质上是指“:”后 面指令所在的存储地址(逻辑地址)。供、和等指令作操作数使用, 以寻找转移目标地址。并非每条指令语句必须有标号,但如果 一条指令前面有一标号,则程序中其它地方就可以引用这个标 号。在例5.1中,、就是标号。标号后面有一个冒号。
• , K3
;()←20H,返回前面的数值
• , K4
;()←01H
• , K3
;()←40H
• , K4
;()←04H
第四章 伪指令
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT) 表达式1,表达式2,… 表达式1,表达式2……是给变量或指定的存储单元赋予初值,它们有以下几种形式: (a)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。 (b)字符串表达式 对于DB伪指令,字符串的长度允许超过2个字符,但不能超过255个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配1字节单元,字符串 从左至右以字符的ASCII码形式按地址递增的顺序依次存放。 (c)?表达式 不带引号的?,用于为变量预留内存单元,暂时不存入数据,即表示所定义的 变量无确定的初值。 例如:A DW ?,?为变量A预留2个字单元。 (d)地址表达式 操作数为地址表达式时,只适用于DW和DD这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用DW伪指令则是取它的偏移地址来初始化变量;用 DD伪指令则是取它的段首地址和偏移地址来初始化变量。 (e)带DUP的表达式 格式为:n DUP (表达式),其中n为重复因子,只能取正整数,它表示定义了 n个相同的数据存储单元。
在8086汇编语言中,运算符分为:算术运算符、逻辑运算符、关系运算
符、数值返回运算符、属性运算符和字节分离运算符。
(一)、表达式
(1)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性。
数据定义伪指令的格式为: [变量名] DB(DW、DD、DQ、DT)
Байду номын сангаас
表达式1,表达式2,„
其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址; DB、DW、DD、DQ和DT是伪指令符,具体一条数据定义伪指令取5种之一。 DB定义的是字节类型的变量,每个表达式被分配1个字节单元。 DW定义的是字类型的变量,每一个表达式被分配1个字单元(2个字节)。 DD定义的是双字类型的变量,每一个表达式被分配2个字单元(4个字节)。 DQ定义的是四字类型的变量,每一个表达式被分配4个字单元(8个字节)。 DT定义的是十字节类型的变量,每一个表达式被分配10个字节单元。
一、8086寻址机制
; List File for DB Examples
0000 19
DATA1 DB 25
; decimal number
0001 89
DATA2 DB 10001001B ; binary number
0002 12
DATA3 DB 12H
; hexadecimal number
0010
ORG 0010H
(2) 数据类型及数据定义伪操作 •ORG 指定数据段数据的存储地址(起始地址的偏 移量)或代码段的起始地址(偏移地址)
格式:ORG 数值 例: ORG 100H
DATA1 DB 100 ······ 例:ORG 200H START:MOV AX,BX ······
• DB 定义字节, 是唯一能定义字符串的伪操作.
.map文件----映象文件,是连接程序(LINK) 产生的可选文件。.map文件给出了每个段的段 名及其在存储器中的起始地址、结束地址和段 长度(字节数)
.exe文件----可执行文件,是连接程序(LINK) 产生的。可被操作系统(DOS)装入内存并由 微处理器执行。
3. 常用伪操作 (1) 程序结构伪操作
DATA2 DB 4BH
SUM
DB ?
DTSEG ENDS
•定义了3个数据项:DATA1、DATA2 ;其中DATA1、DATA2分别定义了 初始值36H、4BH,SUM没有初始值 ,只分配了一个字节的存储单元。
•每个数据项都是字节变量;
• 数据段中定义的数据由代码段中的指令通过变量名来访问。 如代码段中:
•DD 定义双字 对其后的每个数据分配4个字节(2个字); 自动将数据转换成十六进制; 低地址存放低字节,高地址存放高字节;
汇编与接口技术作业2_8086的伪指令
(8)FLD8为100个字变量
ቤተ መጻሕፍቲ ባይዱ
汇编与接口技术作业2:8086的伪指令 题1、2、3(见后PPT) 要求: 1.采用Word文档(2003或2007均可) 2.要抄写题目 3.作业的名称为: 12280001张三_8086的伪指令 4.作业发到邮箱: jshli@ 5.交作业日期: 第休周的星期二
8086的伪指令 1、画图说明下列语句所分配的存储空间及初始化的数据 (1)AA DB ‘BYTE’,12,-12H, 3 DUP(0,?,2 DUP(1,2),?) (2)BB DW 2 DUP(0,1,2),?,-5,‘BY’, ‘TE’,256H 2、假设程序中的数据定义如下: PARTNO DW ? PNAME DB 16 DUP(?) COUNT DD ? PLENTH EQU $-PARTNO 问PLENTH的值是多少?它表示什么意义?
3、请设置一个数据段DATASG,段中变量及数据如下: (1)FLD1为字符串变量:‘computer’ (2)FLD2为十进制字节变量:32 (3)FLD3为十六进制字节变量:20 (4)FLD4为二进制字节变量:01011001 (5)FLD5为10个0的字节变量 (6)FLD6为数字的ASCII字符字节变量32654 (7)FLD7为包括5个十进制数的字变量:5,6,7,8,9
8086常用指令集
8086指令集寄存器:累加器:AX 变址寄存器:SI 代码段寄存器:CS 指令指针:IP基址寄存器:BX 变址寄存器:DI 数据段寄存器:DS 微处理器状态字:PSW 计数寄存器:CX 堆栈寄存器:SP 附加段寄存器:ES数据寄存器:DX 基址指针:BP 堆栈段寄存器:SS属性操作符:符号及含义:SEG:取出段地址OPR:一个操作数REGn:一个n位寄存器OFFSET:取出偏移地址SRC:源操作数MEM:一个存储单元TYPE:取出其类型DST:目的操作数CNT:计数值LENGTH:取出变量重复次数REG:一个寄存器LABEL:标号或过程名SIZE:取出变量的大小SEG:段地址IDATA:立即数数据寻址方式:立即寻址,寄存器寻址,存储器寻址(5种),隐含寻址一:立即寻址:MOV AX ,12A2H ;二:寄存器寻址:MOV DS,AX ; MOV V AR ,BX ;三:存储器寻址:操作数保存在存储单元中(5种)直接寻址:偏移地址直接给出, 1.MOV AX,V AR; 2. MOV DL,V AR2+5;3. MOV CX,[1200H]4. MOV V AR,2500 ;寄存器间接寻址:有效地址存放在寄存器中,直接寻址:1.MOV AX,[ SI ] ; 2.MOV [BX],DX ;寄存器相对寻址:有效地址为一个基址寄存器或变址寄存器的内容怀一个8位或16位的位移量这和. 1.MOV BX,[ SO+5 ] ; 2.MOV CX,V AR[BX]; 3.MOV AL,V AR[DI-5]基址变址寄存器:有效地址为一个基址寄存器和一个变址寄存器之和,1.MOV DX,[BX][SI]2.MOV AX,[BP][SI]基地变址且相对寻址:基址寄存器内容,一个变址寄存器内容,一个位移量,三者之和。
1.MOV AX,[BX+5][SI];2.MOV V AR[BP][DI],AX;数据传送指令:通用传送类指令:MOV 格式: MOV DST,SRC;获取有效地址指令:LEA 格式:LEA REG16, MEM;获取地址指针指令:LDS,LES 格式:LDS REG16, MEM(取高16位送入DS,低16送入REG16中;) 格式; LES REG16, MEM(高16位送入ES,低16送入REG16中)标志传送指令:LAHF,SAHF 格式:LAHF ;PSW寄存器中低8位传送到寄存器AH中格式:SAHF ; 将寄存器AH中低8位传送到PSW寄存器中的低8位数据交换指令:XCHG 格式:XCHG DST,SRC :两个操作数之间数据的交换字节转换指令:XLAT 格式:XLAT :堆栈操作指令:PUSH,POP,PUSHF,POPF算术运算类指令:加减法指令:加法指令:ADD,ADC : 格式:ADD DST,SRC ;将SRC+DST的结果存入DSTADC DST,SRC;将SRC+DST+CF的结果存入DST 减法指令:SUB,SBB: 格式:SUB DST,SRC;相似上方,取负指令:NEG 格式:NEG DST; 0-DST的结果存在DST.比较指令:CMP 格式:CMP DST,SRC; DST-SRC的结果设置PSW的状态标志位。
8086汇编语言
8086汇编语言8086汇编语言是一种用于编写Intel 8086微处理器的程序的低级语言。
它是x86指令集的最早版本,是现代PC上使用的汇编语言的基础。
本文将介绍8086汇编语言的基本概念、指令系统、程序格式、程序设计方法和应用实例,以帮助读者掌握这门古老而强大的语言。
什么是8086汇编语言8086汇编语言是一种用助记符表示机器指令的语言,它可以直接操作CPU、寄存器、内存和端口等硬件资源。
8086汇编语言的优点是执行速度快、占用空间少、控制能力强,缺点是可读性差、可移植性差、编程难度大。
8086汇编语言的程序由三个部分组成:伪指令、指令和数据。
伪指令是用来告诉汇编程序如何处理源程序的命令,如定义变量、分配内存、设置段属性等。
指令是用来控制CPU执行操作的命令,如数据传送、算术运算、逻辑运算、控制转移等。
数据是用来存储或操作的信息,如常数、变量、字符串等。
8086汇编语言的程序需要经过汇编程序(如MASM)将源代码转换为机器代码,然后再由链接程序(如LINK)将多个目标模块连接成可执行文件,最后由加载程序(如DOS)将可执行文件加载到内存中运行。
8086微处理器8086微处理器是Intel公司于1978年推出的一款16位微处理器,它是x86系列微处理器的第一代产品,也是IBM PC机的原始CPU。
它具有以下特点:工作频率为5MHz~10MHz,每秒可执行约33万条指令内部结构由总线接口单元(BIU)和执行单元(EU)组成,实现了取指和执行的并行操作寄存器由四个16位通用寄存器(AX, BX, CX, DX)、四个16位段寄存器(CS, DS, SS, ES)、一个16位标志寄存器(FLAGS)和一个16位指令指针(IP)组成指令系统由100多条指令组成,分为数据传送类、算术运算类、位操作类、控制转移类和处理机控制类五大类存储器管理采用了分段机制,每个段最大为64KB,总容量为1MB支持两种工作模式:实地址模式和保护模式,实地址模式下可以直接访问物理地址,保护模式下可以实现多任务和内存保护8086汇编语言程序格式8086汇编语言程序一般采用以下格式:[段名] segment [段属性][伪指令][数据][子程序][段名] ends其中:段名是用来标识一个段的名称,可以自定义,但不能与伪指令或寄存器重名段属性是用来设置一个段的类型和特征,如代码段(code)、数据段(data)、堆栈段(stack)等伪指令是用来定义变量、分配内存、设置偏移量等功能的命令,如DB, DW, DD, ORG, ASSUME等数据是用来存储或操作的信息,如常数、变量、字符串等子程序是用来实现特定功能的代码段,如输入输出、排序、查找等一个典型的8086汇编语言程序由以下三个段组成:数据段(data segment):用来存放程序中用到的数据,如变量、常量、字符串等代码段(code segment):用来存放程序中的指令,如数据传送、算术运算、控制转移等堆栈段(stack segment):用来存放程序中的临时数据,如函数调用时的参数、返回地址、局部变量等一个简单的8086汇编语言程序示例如下:data segmentmsg db 'Hello, world!', '$' ;定义一个字符串变量data endscode segmentassume cs:code, ds:data ;告诉汇编程序代码段和数据段的名称start: ;程序入口标号mov ax, data ;将数据段地址加载到ax寄存器mov ds, ax ;将ax寄存器的值传送到ds寄存器,设置数据段寄存器mov dx, offset msg ;将字符串变量的偏移地址加载到dx寄存器mov ah, 9 ;设置ah寄存器为9,表示调用DOS中断的输出字符串功能int 21h ;调用DOS中断21h,输出字符串mov ah, 4ch ;设置ah寄存器为4ch,表示调用DOS中断的退出程序功能int 21h ;调用DOS中断21h,退出程序code endsend start ;告诉汇编程序程序结束的位置8086汇编语言指令系统8086汇编语言指令系统由100多条指令组成,分为五大类:数据传送类:用来实现数据在寄存器、内存和端口之间的传送,如MOV, PUSH, POP, XCHG等算术运算类:用来实现数据的加减乘除等运算,如ADD, SUB, MUL, DIV等位操作类:用来实现数据的位移、旋转、逻辑和测试等操作,如SHL, SHR, ROL, ROR, AND, OR, XOR, NOT, TEST等控制转移类:用来实现程序的顺序、条件和无条件跳转,如JMP, JZ, JNZ, JCXZ, CALL, RET等处理机控制类:用来实现处理机状态的设置和查询,如CLC, STC, CMC, CLD, STD, CLI, STI等每条指令由助记符和操作数组成,助记符表示指令的功能,操作数表示指令的对象。
伪 指 令
<>
2.标号定义伪指令
格式:标识符 LABEL 类型 功能:给其后的内存单元定义一个新的类型属性
说明:给该伪指令后面的一个变量或标号定义另外一种属性,但不 重新分配内存空间,便于以多种形式访问定义的变量或标号。
例如: WORD_ARY LABEL WORD
BYTE_ARY DB 100 DUP (0)
其汇编后的存储格式如图。
(4,5),6)
<>
1.3 段定义伪指令
8086/8088的存储器采用分段技术来组织,存储器的物理地址是 由段地址和偏移地址组合而成。因此,8086/8088的程序设计必须按 段来组织、使用存储器,每一个数据或代码都应存储于一个指定的段 当中,与段定义有关的伪指令是:SEGMENT┅ENDS,ASSUME和ORG
MY_DATA SEGMENT ;定义一个数据段,内部有三个变量
ORG 100H ;数据段的变量从100H开始定义
X DB 10 ;偏移地址为100H
Y DB 6 ;偏移地址为101H
Z DB ? ;偏移地址为102H
MY_DATA
ENDS
;段定义结束
MY_STACK
SEGMENT
;定义一个100字的堆栈
分别使用两个变量名,对一个存储空间,实现字节地址存取一个字节,
或字地址同时存取两个字节数据。
又比如:
FAR_LAB LABEL FAR ;定义下面程序为远调用,可被其它段调用。
NEAR_LAB:PUSH AX ;段内标号,只能被同一段内的程序调用。
┋
;程序体
<>
1.2 变量定义伪指令
变量定义就是为数据分配一个确定的存储单元,同时,为了程序使用 该单元方便,给这个存储单元取了一个唯一的名字(变量名)。定义 的存储单元可以是字节、字、双字、三字、四字和十字节
(汇编语言)5 80868088汇编语言-2
段名:
– 给每个逻辑段指定一个名字,通常根据段体的意义给段命名,如 堆栈段可取名为STACK,数据段可取名为DATA,代码段则可命 名为CODE。 – 指出为该段分配的存储区起始位置。
语句序列:
– 对于数据段、附加段和堆栈段来说,这一部分一般是存储单元的 定义和分配等伪指令语句; – 对于代码段来说则是指令语句以及伪指令语句。
AT 表达式
– 段首地址为表达式计算出来的16位值。但不能用于CS。
MEMORY
– 把该段定位在存储器中国最高地址处。
STACK
– 把各模块中的同名段组合成一个堆栈段,其长度给各原有段之和。
默认值为:PRIVATE
例子:
【例】有两个模块,各模块段定义如下
模块1: 模块2: ┆
┆
DATA1 M1 DATA1 SEGMENT DB 45H PARA PUBLIC ‘DATA1’
II、定位类型
段名 SEGMENT [定位类型] [组合类型] [使用类型] [‘类别’] …… …… ; 语句序列 段名 ENDS
PARA(节边界),段起始地址最低四位必须是0。 BYTE (字节边界),本段起始地址可以从任一地址处开 始存放。 WORD (字边界),段起始地址的最低一位必须是0。 PAGE (页边界),起始地址的最低八位必须是0。
2、源程序开始和结束伪指令
程序开始伪指令
– NAME伪指令 – TITLE伪指令
程序结束伪指令
– END
(1)程序开始伪指令NAME
NAME伪指令 格式:NAME 模块名 含义:表示一个模块的开始,并给出该模 块名。
(1)程序开始伪指令TITLE
TITLE伪指令 格式:TITLE TEXT 功能:用来给源程序设置标题,以后每页第一行 都列出该标题。 在无NAME命令情况下,TEXT的前6个字符一般用作 模块名。 TEXT为标题,即为不加引号的字符串,最长为60 个字符。 一个程序模块中只允许一个TITLE命令,否则引起 错误。
第四章伪指令
第四章伪指令汇编语言源程序由一系列语句构成,这些语句既可以是指令,也可以是伪指令。
指令是由CPU负责执行的,每一条指令都和一条机器语言相对应。
而伪指令是由汇编程序负责执行,完成一些内存单元分配、段之间的连接关系等操作,所以伪指令并不会生成机器指令,也就不会被CPU执行。
在本章中,重点讲解一些常用的伪指令及其功能。
4.1伪指令的分类及伪指令语句格式伪指令又称为伪操作,它虽然不会被CPU执行,但却可以指示汇编程序按照用户的意图,完成数据的定义、存储器的分配、指示程序结束等功能。
所以伪指令在汇编语言程序设计过程中具有重要的意义,希望读者在学习过程中应该加以高度重视。
4.1.1 伪指令的分类8088/8086的伪指令大致可分为以下八类:·数据定义伪指令;·符号定义伪指令;·段定义伪指令;·过程定义伪指令;·结束伪指令;·条件汇编伪指令;·结构、记录定义伪指令;·其他伪指令。
其中,条件汇编伪指令与结构、记录定义伪指令将在第八章予以介绍。
4.1.2 伪指令语句格式伪指令语句格式一般由四部分组成。
语句格式: [变量] 伪指令助记符参数1,参数2····参数n[;注释]说明:伪指令助记符规定了伪指令的功能。
一般伪指令都有参数,用于说明伪指令的操作对象,参数的类型和个数随着伪指令的不同而不同。
有时参数是常数或数值表达式,有时参数是一般的符号,有时是具有特殊意义的符号。
伪指令语句中的变量可有可无,如果伪指令语句中出现变量,则汇编程序使其记以第一个字节的偏移地址。
注释部分也是可有可无的,用于说明该伪指令的功能。
例如 VAR1 DW 1234H,5678H ;定义VAR1为字变量该语句中的VAR1为变量;DW为伪指令助记符;1234H与5678H为参数;分号后面给出的文字为注释。
4.2汇编语言中的数据项数据项是指令或伪指令语句操作对象的基本组成部分。
微机原理8086汇编语言程序设计
;这是一个乘10子程序
;使用寄存器AX
;入口:AX,出口:AX
proc far
push bx
;保护现场
pushf
add ax,ax
;2ax
功
mov bx,ax
;2ax ?bx
能
add ax,ax
;4ax
程
add ax,ax
;8ax
序
add ax,bx
;10ax
段
popf
;恢复现场
pop bx
ret
endp
第四章 8086汇编语言程序设计
? 几个概念 ? 8086汇编语言的语句 ? 8086汇编中的伪指令 ? 8086汇编中的运算符 ? 汇编语言程序设计 ? 宏定义与宏调用 ? 系统调用
几个概念
? 汇编语言 ? 汇编语言源程序 ? 汇编 ? 汇编程序
4.1 8086汇编语言的语句
汇编语言由指令性语句和指令性语句组成 ? 一、指令性语句格式
CODE SEGMENT
;定义代码段
ASSUME DS:DATA , CS: CODE
START: MOV AX , DATA
;初始化DS
MOV DS , AX
……
MOV AX , 4C00H ;返回DOS
INT 21H
CODE ENDS
;代码段结束
END START
;源程序结束
;段属性说明
? 特点 ? 程序分段 ? 语句由指令性和指示性语句组成 ? 两种程序框架
? 3、 ORG伪指令、地址计数器 $
ORG伪指令格式: ORG <表达式>
? 4、END 表示源代码结束 格式为: END 常数或表达式.
3.8086汇编语言-3
3.3 常用汇编指令
三、逻辑运算指令 4.移位指令(SHL/SHR、SAL/SAR、ROL/ROR、RCL/RCR)
⑺ 带CF循环左移(RCL)功能
3.3 常用汇编指令
三、逻辑运算指令 4.移位指令(SHL/SHR、SAL/SAR、ROL/ROR、RCL/RCR)
⑻ 带CF循环右移(RCR)功能
3.3 常用汇编指令
三、逻辑运算指令 4.移位指令(SHL/SHR、SAL/SAR、ROL/ROR、RCL/RCR)
⑷ 算术右移(SAR)功能:
算术右移一位,等于对有符号数进行 进行÷ 运算 算术右移N 运算, 算术右移一位,等于对有符号数进行÷2运算,算术右移 次 , 则 ÷ 2N 。 例 : MOV AH,- ;AH=0F8H=1111 1000B ,-8 ,- SHR AH, 2 , ;CF=0,BL=1111 1110B=0FEH= -2 ,
3.3 常用汇编指令
三、逻辑运算指令 1.逻辑与/或/异或指令 逻辑与/ 异或指令 指令—AND/OR/XOR
格式: 格式: AND DST ,SRC OR DST ,SRC XOR DST ,SRC 功能: 功能:(DST) and/or/xor (SRC) 要求: 要求:
通用Regs 通用Regs
⑴ 逻辑左移(SHL)功能:
逻辑左移一位,相当于对无符号操作数乘 运算 运算, 逻辑左移一位,相当于对无符号操作数乘2运算,逻辑左移 无符号操作数 N次,则乘 N,但要防止溢出。例: 防止溢出。 次 则乘2 但要防止溢出 MOV BL,0CH ;BL=0CH=12=0000 1100B , SHL BL,2 , ;CF=0,BL=0011 0000B=48=12* 22 ,
两操作数按位各自运算 两操作数按位各自运算 与(AND): 见0为0,全1为1 : 为 , 为 或(OR): : 见1为1,全0为0 为 , 为 异或(XOR):不同为 ,相同为 异或 :不同为1,相同为0
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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_seg1 segment ; 定义数据段...data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * *data_seg2 segment ; 定义附加段...data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2start: ; 程序执行的起始地址; set DS register to current data segmentmov ax, data_seg1 ; 数据段地址mov ds, ax ; 存入DS寄存器; set ES register to current extra segmentmov ax, data_seg2 ; 附加段地址mov es, ax ; 存入ES寄存器...code_seg ends ; 代码段结束; * * * * * * * * * * * * * * * * * * * * * * * * * *end start由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入DS寄存器MOV AX,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOV AX,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入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 STACKDSEG1 SEGMENT PARA PUBLIC 'Data'DSEG2 SEGMENT PARACSEG SEGMENT PARA 'Code'模块2 DSEG1 SEGMENT PARA PUBLIC 'Data'DSEG2 SEGMENT PARACSEG SEGMENT PARA 'Code'以上两个模块分别汇编后产生 .OBJ 文件,经连接程序连接后产生的 .EXE模块如下:模块1 CSEG SEGMENT PARA 'Code'模块2 CSEG SEGMENT PARA 'Code'模块1+2 DSEG1 SEGMENT PARA PUBLIC 'Data'模块1 DSEG2 SEGMENT PARA模块2 DSEG2 SEGMENT PARA模块1 SSEG SEGMENT PARA STACK4.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.存储模型伪指令:和代码都是近访问的。
这种模型的数据段是指数据段、堆栈段和附加段的总和。
在DOS下用汇编语言编程时,可根据程序的不同特点选择前6种模型,一般可以选用SMALL模型。
另外,TINY模型将产生COM程序,其他模型产生EXE程序。
FLAT模型只能运行在32位x86 CPU上,DOS 下不允许使用这种模型。
当与高级语言混合编程时,两者的存储模型应当一致。
2.简化的段伪指令表4.2.4 简化段伪指令的格式如下表:下面的举例说明预定义符号的使用方法。
在完整的段定义情况下,在程序的一开始,需要用段名装入数据段寄存器,如例4.1中的mov ax,data_seg1mov ds,ax若用简化段定义,则数据段只用.data来定义,而并未给出段名,此时可用mov ax,@datamov ds,ax这里预定义符号@data就给出了数据段的段名。
4.简化段定义举例例4.3.MODEL SMALL.STACK 100H ; 定义堆栈段及其大小.DATA ; 定义数据段....CODE ; 定义代码段START: ; 起始执行地址标号MOV AX, @DATA ; 数据段地址MOV DS, AX ; 存入数据段寄存器...MOV AX, 4C00HINT 21HEND START ; 程序结束从例4.3可以看出,简化段定义比完整的段定义简单得多。
但由于完整的段定义可以全面地说明段的各种类型与属性,因此在很多情况下仍需使用它。
4.2.2 段组定义伪指令段组定义伪指令能把多个同类段合并为一个64KB的物理段,并用一个段组名统一存取它。
段组定义伪指令GROUP的格式如下:段组名GROUP 段名 [, 段名…]我们已经知道在各种存储模型中,汇编程序自动地把各数据段组成一个段组DGROUP,以便程序在访问各数据段时使用一个数据段寄存器DS,而GROUP伪指令允许用户自行指定段组。
例4.4 将两个数据段DSEG1 和DSEG2合并在一个段组DATAGROUP中。
;----------------------------------------------------DSEG1 SEGMENT WORD PUBLIC 'DATA'...DSEG1 ENDS;---------------------------------------------------DSEG2 SEGMENT WORD PUBLIC 'DATA'...DSEG2 ENDSMOV AX, @DATA ; 数据段地址MOV DS, AX ; 存入数据段寄存器...;---------------------------------------------------DATAGROUP GROUP DSEG1, DSEG2 ;组合成段组CSEG SEGMENT PARA PUBLIC 'CODE'ASSUME CS : CSEG, DS : DATAGROUPSTART:MOV AX, DATAGROUPMOV DS, AX ;DS赋值为段组地址...MOV AX, 4C00HINT 21HCSEG ENDS;-----------------------------------------------------END START利用GROUP伪指令定义段组后,段组内统一为一个段地址,各段定义的变量和标号都可以用同一个段寄存器进行访问。