汇编语言程序设计综述_第1页
汇编语言程序设计综述_第2页
汇编语言程序设计综述_第3页
汇编语言程序设计综述_第4页
汇编语言程序设计综述_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章汇编语言程序设计3.18086的指令系统机器指令:命令机器做某种操作的一条语句称为一个机器指令;指令系统:全部机器指令的集合称为指令系统。汇编语言:是机器语言的一种助记符形式,与机器语言一一对应;高级语言汇编语言机器语言一、指令格式操作码:告诉计算机执行什么性质的操作,每条指令只能有一个操作码;操作数:告诉计算机对什么样的对象进行操作,8086指令系统中,操作数的数目有0~2个。2个操作数:MOV AX,BX1个操作数:INC AX0个操作数:CLI操作码

操作数1,操作数2汇编语言机器语言MOD含义MOD含义00存储器方式,无位移量01存储器方式,有8位位移量10存储器方式,有16位位移量11寄存器方式,无位移量REGW=1W=0REGW=1W=0000AXAL100SPAH001CXCL101BPCH010DXDL110SIDH011BXBL111DIBHD01含义寄存器为源寄存器寄存器为目的寄存器MODR/M存储器方式寄存器方式有效地址的计算公式W=0W=100011011000BX+SIBX+SI+D8BX+SI+D16ALAX001BX+DIBX+DI+D8BX+DI+D16CLCX010BP+SIBP+SI+D8BP+SI+D16DLDX011BP+DIBP+DI+D8BP+DI+D16BLBX100SISI+D8SI+D16AHSP101DIDI+D8DI+D16CHBP110D16BP+D8BP+D16DHSI111BXBX+D8BX+D16BHDI汇编语言机器语言汇编语言:MOV AX,[BX+SI]机器语言:8B00HD=1:寄存器为目的寄存器;W=1:16操作;MOD=00:从存储器中读,无偏移;REG=000:AX,结合D,目的为AX;R/M=000:结合MOD,[BX+SI]。汇编语言机器语言1000101100000000操作码DWMODREGR/MCPU:计算指令物理地址

CS╳10H+IP=40000H+1000H=41000HCPU:指令物理地址(41000H)地址总线存储器:指令(8B00H)数据总线CPU:指令指令译码器执行控制电路CPU:计算数据偏移地址

BX+SI=14A0H+000AH=14AAHCPU:计算数据物理地址

DS╳10H+偏移地址=10000H+14AAH=114AAHCPU:数据物理地址(114AAH)地址总线存储器:数据(B0A1)数据总线CPU:数据寄存器

AX=B0A1H机器指令的执行A1B0008B114AAH114ABH41000H41001HCS:4000H,DS:1000HIP:1000HBX:14A0H,SI:0AHMOV AX,[BX+SI]二、寻址方式所谓指令的寻址方式是指在指令中操作数的表示方式。8086的寻址方式包括:立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O端口寻址和程序转移寻址。指令直接给出操作数的数值,机器码的最后1或2个字节就是操作数—立即数。例:MOV AX,1020H MOV BH,100立即数只能作为源操作数,不能作为目的操作数。1、立即寻址操作数在寄存器中,寄存器的内容就是操作数的数值。例:MOV CX,AX MOV AH,AL MOV DS,AXIP寄存器不能作为操作数。2、寄存器寻址操作数在存储器中,指令中给出存储器的(偏移)地址。直接寻址:MOV DX,[2100H]寄存器间接寻址:MOV CX,[SI]

MOV [BX],AL可以用于间接寻址的寄存器:BX,SI,DI,BP。注意区分:“MOVAX,BX”和”MOVAX,[BX]”的不同

“MOVAX,1000H”和”MOVAX,[1000H]”3、存储器寻址基址寻址:MOV [BX+200H],AX变址寻址:MOV CX,[SI+246]基址变址寻址:MOV [BX+SI],DL

MOV CX,[BX+DI+100H]基址寄存器:BX,BP,变址寄存器:SI,DI基址变址寻址中只能有一个基址寄存器和一个变址寄存器注意:包括BP的基址寻址或基址变址寻址的默认段寄存器为SS,而不是DS。3、存储器寻址名称程序名命令行生成汇编程序MASMmasma.asma.obj连接程序LINKlinka.obja.exe调试程序DEBUGdebuga.exe三、汇编语言程序DATA SEGMENT STRING DB ‘HelloWorld!’,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX

MOV DX,OFFSETSTRING MOV AH,9 INT 21H MOV AX,4C00H INT 21HCODE ENDSSTACK SEGMENT STACK DB 256DUP(?)STACK ENDS END START例1:第一个程序分段结构:包括数据段、代码段和堆栈段。语句行:指令性语句:真正对应着由CPU执行的机器指令的语句。指示性语句:不产生机器指令,只是告诉MASM如何去汇编程序的语句。宏汇编语言程序DATA SEGMENT STRING DB ‘HelloWorld!’,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:

MOV AX,DATA MOV DS,AX

MOV DX,OFFSETSTRING MOV AH,9 INT 21H MOV AX,4C00H INT 21HCODE ENDSSTACK SEGMENT STACK DB 256DUP(?)STACK ENDS END START指令性语句指示性语句指示性语句数据段代码段堆栈段DATA SEGMENT STRING DB ‘HelloWorld!’,‘$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATA MOV DS,AX

MOV DX,OFFSETSTRING MOV AH,9 INT 21H

MOV AX,4C00H INT 21HCODE ENDSSTACK SEGMENT STACK DB 256DUP(?)STACK ENDS END START数据定义程序代码程序框架1、段定义伪指令

段起始和结束伪指令

段名SEGMENT

段名ENDS2)段寄存器与段关系说明伪指令

ASSUME 段寄存器:段名,段寄存器:段名,… 3)程序开始和结束伪指令

END伪指令一方面通知汇编程序结束汇编,同时指明

标号语句为程序开始执行的起始地址。指示性语句2、数据定义伪指令1)常量定义 格式: 表达式名 EQU 表达式

2)数据定义 格式:变量名(标号)数据类型定义伪指令表达式

DB 1个字节,8位

DW 2个字节,16位

DD 4个字节,32位

DQ 8个字节,64位

DT 10个字节,80位3)重复伪指令

格式: 重复次数 DUP (重复内容)指示性语句3、汇编语句定位伪指令

ORG语句用来定义起始位置,可以用来定位数据和程序 格式:

ORG 表达式4、取段址和取偏移址伪指令 格式:

SEG 地址标号或变量名

OFFSET 地址标号或变量名指示性语句数据传送指令:

MOV

把源操作数送给目的操作数

XCHG

交换两个操作数的数据

PUSH,POP

把操作数压入或取出堆栈

PUSHF,POPF, 堆栈指令群

PUSHA,POPA

LEA,LDS,LES

取地址至寄存器

XLAT(XLATB) 查表指令四、8086指令系统8086指令系统算术运算指令:

ADD,ADC

加法指令

SUB,SBB

减法指令

INC,DEC

加一或减一

NEG

取二进制补码

MUL,IMUL

乘法指令

DIV,IDIV

除法指令

CBW,CWD

有符号数扩展指令

AAA,AAS,AAM,AAD 非压BCD码运算调整指令

DAA,DAS 压缩BCD码调整指令8086指令系统位运算指令:AND,OR,XOR,NOT,TEST

逻辑运算SHR,SHL,SAR,SAL

移位指令ROR,ROL,RCR,RCL

循环移位指令

8086指令系统程序转移指令: CLC,STC,CMC 设定进位标志 CLD,STD 设定方向标志

CLI,STI

设定中断标志

CMP

比较

JMP

跳往指定地址执行

JXX

条件转移指令

LOOP

循环指令 LOOPE(Z) 条件循环指令

CALL,RET

子程序调用,返回指令

INT,IRET

中断调用及返回指令8086指令系统串操作指令: MOVSB,MOVSW,MOVSD 字符串传送指令

CMPSB,CMPSW,CMPSD 字符串比较指令

SCASB,SCASW 字符串搜索指令

LODSB,LODSW 字符串载入指令

STOSB,STOSW 字符串存贮指令

REP,REPE,REPNE 重复前缀指令五、顺序程序设计

1、数据传送指令

一般传送指令格式: MOV 目的,源功能:该指令将源内容送至目的地址中

交换指令格式:

XCHG 操作数1,操作数2功能:源操作数内容和目的操作数对调。

非法传送方式:立即数作为目的: MOV 12H,AL16位立即数8位寄存器: MOV BH,1000H立即数段寄存器: MOV DS,2000H存储器存储器: MOV [BX],[1000H]数据传送指令DATA SEGMENT ORG 100H BUF DW 4B10H,1020H,10H,22H,4C21H ADDR DD 56781234h AD_BUF DD BUF STRING DB ‘abcd’ AD_STRING DD STRING OFF_STRING DW STRINGDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,BUF ;AX=? MOV DX,WORDPTRADDR ;DX=?例2:数据传送,DATA=2000H物理地址存储内容20100H10H20101H4BH20102H20H20103H10H20104H10H20105H00H20106H22H20107H00H20108H21H20109H4CH2010AH34H2010BH12H2010CH78H2010DH56H MOV AX,SEGADDR ;AX=? MOV DS,AX MOV CX,BUF+2 ;CX=? MOV SI,OFFSETAD_BUF ;SI=? MOV AL,STRING ;AL=? MOV AX,OFF_STRING ;AX=? XCHG CX,AX ;CX=? ;AX=? MOV AX,4C00H INT 21HCODE ENDS ENDSTART物理地址存储内容2010EH00H2010FH01H20110H00H20111H20H20112H61H20113H62H20114H63H20115H64H20116H12H20117H01H20118H00H20119H20H2011AH12H2011BH01H2、算术运算指令

加减运算指令格式:

ADD/ADC 目的操作数,源操作数

SUB/SBB 目的操作数,源操作数功能:

ADD: 目的操作数=目的操作数+源操作数

SUB: 目的操作数=目的操作数–源操作数

ADC: 目的操作数=目的操作数+源操作数+CF SBB: 目的操作数=目的操作数–源操作数–CF影响标志位:

进位标志:CF,奇偶标志:PF,零标志:ZF,符号标志:SF

溢出标志:OF,辅助进位标志:AF算术运算指令DATA SEGMENT VAR8_1 DB 78H VAR8_2 DB 52H VAR8_3 DB 3AH VAR16_1 DW 3411H VAR16_2 DW 3ABCH VAR16_3 DW 4020H VAR32_1 DD 0AABBCCDDH VAR32_2 DD 12345678H VAR32_3 DD 11223344H RESULT1 DB ? RESULT2 DW ? RESULT3 DD ?DATA ENDS例3:8,16,32加减法运算CODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AL,VAR8_1 ;8位运算

ADD AL,VAR8_2 SUB AL,VAR8_3 MOV RESULT1,AL MOV AX,VAR16_1 ;16位运算

ADD AX,VAR16_2 SUB AX,VAR16_3 MOV RESULT2,AX

MOV AX,WORDPTRVAR32_1 ;32位运算

MOV DX,WORDPTRVAR32_1+2 ADD AX,WORDPTRVAR32_2 ADC DX,WORDPTRVAR32_2+2 SUB AX,WORDPTRVAR32_3 SBB DX,WORDPTRVAR32_3+2 MOV WORDPTRRESULT3,AX MOV WORDPTRRESULT3+2,DX MOV AX,4C00H INT 21HCODE ENDS END START

加一、减一指令格式:

INC 操作数

DEC 操作数功能: 操作数加一或减一影响标志位: 不影响进位标志CF,但影响零标志ZF。

算术运算指令

乘除指令格式:

MUL/DIV 源操作数

IMUL/IDIV 源操作数功能:

MUL/DIV:无符号数乘/除法;

IMUL/IDIV:有符号数乘/除法;

指令只给出源操作数,目的操作数隐含。算术运算指令运算被乘/除数源操作数结果8位乘8位AL8位AX16位乘16位AX16位DX:AX16位除8位AX8位商:AL,余数:AH32位除16位DX:AX16位商:AX,余数:DXDATA SEGMENT X DW 25 Y DW 20 Z DW 140 V DW 50 F DW 2DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,X IMUL Y ;DX:AX=X*Y

MOV CX,AX MOV BX,DX ;BX:CX=X*Y MOV AX,Z CWD ;DX:AX=Z ADD CX,AX ADC BX,DX ;BX:CX=X*Y+Z SUB CX,540 SBB BX,0 ;BX:CX=X*Y+Z-540 MOV AX,V CWD ;DX:AX=V SUB AX,CX SBB DX,BX ;DX:AX=V–(X*Y+Z-540) IDIV X ;AX=(V-(X*Y+Z-540))/X(商) ;DX=(V-(X*Y+Z-540))/X(余数) MOV F,AX MOV F+2,DX MOV AX,4C00H INT 21HCODE ENDS END START2、位运算指令

逻辑运算指令格式:

NOT 目的操作数 AND 目的操作数,源操作数

OR 目的操作数,源操作数

XOR 目的操作数,源操作数 TEST 目的操作数,源操作数功能:

NOT:

目的操作数按位取反; AND,OR,XOR:目的操作数与源操作数按位进行与、或、异或运

算,结果保存在目的操作数中。 TEST: 作用同AND指令相同,但结果不保存在目的操作

数中,只是影响标志位。位运算指令

算术移位指令格式:

SAL 目的操作数,计数值

SAR 目的操作数,计数值移位示意图位运算指令SAL:SAR:

逻辑移位指令格式:

SHL 目的操作数,计数值

SHR 目的操作数,计数值移位示意图位运算指令SHL:SHR:

不带进位位的循环移位指令格式:

ROL 目的操作数,计数值

ROR 目的操作数,计数值移位示意图位运算指令ROL:ROR:

带进位位的循环移位指令格式:

RCL 目的操作数,计数值

RCR 目的操作数,计数值移位示意图位运算指令RCL:RCR: DATA SEGMENT DAT1 DW 0109H DATA ENDS CODE SEGMENT … MOV AX,DAT1 MOV CL,4 SHL AH,CL ROL AX,CL ROL AL,CL MOV BYTEPTRDAT1,AL … CODE ENDS …例5:非压缩BCD码压缩BCD码0109H19H(例3-18)六、分支程序设计1、比较指令格式:

CMP 目的操作数,源操作数功能:

同SUB指令相似,但结果不保存到目的操作数中,只是

影响标志位。2、无条件转移指令格式:

JMP 目标地址(标号)功能:

无条件转移到目的地址处执行,即改变IP的值为目的

地址3、条件转移指令格式:

JX 目的地址(标号)

根据单个标志位转移条件转移指令指令条件JC和JNC进位标志JE/JZ和JNE/JNZ零标志JS和JNS符号标志JO和JNO溢出标志JP/JPE和JNP/JNPE奇偶标志条件转移指令指令条件JA/JNBE大于JAE/JNB大于等于JB/JNAE小于JBE/JNA小于等于指令条件JG/JNLE大于JGE/JNL大于等于JL/JNGE小于JLE/JNG小于等于根据无符号数的大小转移根据有符号数的大小转移DATA SEGMENT XX DB -9 YY DB ?DATA ENDSCODE SEGMENT … MOV AL,XX CMP AL,0 JGE BIGR MOV AL,0FFH MOV YY,AL ;X<0 JMP EXITBIGR: LE EQUL MOV AL,1 MOV YY,AL ;X>0 JMP EXITEQUL: MOV YY,AL ;X=0EXIT: …CODE ENDS END START例6:符号函数(例3-19)DATA SEGMENT X DW 180 Y DW 850 Z DW 320 MAX DW ?DATA ENDSCODE SEGMENT … MOV AX,X CMP AX,Y JAE XAEY MOV AX,YXAEY: ;AX=max(X,Y) CMP AX,Z JAE XMAX MOV AX,ZXMAX: ;AX=max(X,Y,Z) MOV MAX,AXCODE ENDS END START例7-1:MAX=max(X,Y,Z)DATA SEGMENT X DB -5 Y DB 23 Z DB 7DATA ENDSCODE SEGMENT … MOV AL,X CMP AL,Y JL XLY XCHG AL,Y MOV X,ALXLY: CMP AL,Z JL CMYZ XCHG AL,Z XCHG AL,XCMYZ: MOV AL,Y CMP AL,Z JL EXIT XCHG AL,Z XCHG AL,YEXIT: …例7-2:X=min(X,Y,Z)Y=median(X,Y,Z)Z=max(X,Y,Z)DATA SEGMENT A DW a1,a2,…,a100 Y DD ?DATA ENDSCODE SEGMENT … MOV AX,0 MOV DX,0 ADD AX,A ADC DX,0 ADD AX,A+2 ADC DX,0 … ADD AX,A+198 ADC DX,0 MOV WORDPTRY,AX MOV WORDPTRY+2,DX …七、循环程序设计

CODE SEGMENT ASSUME CS:DATA,DS:DATASTART: …

MOV AX,0 MOV DX,0 MOV BX,OFFSETA MOV CX,100LOP:

ADD AX,[BX] ADC DX,0

ADD BX,2 DEC CX

JNZ LOP MOV WORDPTRY,AX MOV WORDPTRY+2,DX …初始化循环工作循环修改循环控制

CODE SEGMENT ASSUME CS:DATA,DS:DATASTART: …

MOV AX,0 MOV DX,0 MOV BX,OFFSETA MOV CX,100LOP:

ADD AX,[BX] ADC DX,0

ADD BX,2 LOOP LOP

MOV WORDPTRY,AX MOV WORDPTRY+2,DX …初始化循环工作循环修改循环控制

循环指令格式:

LOOP 目标地址(标号)功能: DEC CX JNZ 目标地址说明:

LOOP指令只能进行短转移,LOOP指令的地址和目的

地址之间相差必须在-128~+127之间。循环指令循环程序结构先执行,后判断先判断,后执行DATA SEGMENT D1 DB -1,-13,6,9,-23,35,-5,123… COUNT EQU $-D1 RS DW ?DATA ENDSCODE SEGMENT … MOV BX,OFFSETD1 MOV CX,COUNT MOV DX,0LOP1: MOV AL,[BX] CMP AL,0 JGE GONEXT INC DXGONEXT: INC BX LOOP LOP MOV RS,DX …例9:RESULT=D1中的负数个数(例3-24)CODE SEGMENT … MOV CX,0LOP: AND AX,AX JZ STOP SAL AX,1 JNC NOD INC CXNOD: JMP LOPSTOP: …例10:CX=AX中1的个数(例3-25)DATA SEGMENT TEXT DB ‘ChangeLowercaseLetters’ DB ‘ToUppercaseLetters$’DATA ENDSCODE SEGMENT … MOV BX,OFFSETTEXTB20: MOV AL,[BX] CMP AL,‘$’ JE EXIT CMP AL,‘a’ JB B30 CMP AL,‘z’ JA B30 SUB AL,20H MOV [BX],ALB30: INC BX JMP B20EXIT: … 例11:小写字母变大写字母堆栈堆栈是一种数据存储结构,由栈顶和栈底构成的,每次对数据的操作都是在栈顶进行的;对堆栈数据的存取原则是“后进先出”。入栈(PUSH)和出栈(POP)指令:PUSH srcSPSP-2[SP+1]&[SP]srcPOP destdest[SP+1]&[SP]SPSP+28086中当前堆栈的栈顶由SS:SP指示入栈过程:PUSH AX

假设:SS=9000H,SP=1000H,AX=55AAHSP-1SP:SP=0FFFH;将AHSS:SP中:[90FFFH]=55H;SP-1SP:SP=0FFEH;将ALSS:SP中:[90FFEH]=AAH。8086堆栈操作的过程出栈操作:POP BXSS:SP中的数据BL:BL=AAH;SP+1SP:SP=0FFFH;SS:SP中的数据BH:BH=55HSP+1SP。8086堆栈操作的过程八、子程序1、调用指令格式:

CALL 过程名或目的地址调用指令的分类段内直接调用(NEAR)段间直接调用(FAR)段内间接调用(NEAR)段间间接调用(FAR)调用过程断点IP入栈,近调用时压入偏移地址,远调用时压入段地址和偏移地址;将目标地址的偏移地址送入IP,远调用时还要将目标地址的段地址送入CS;2、返回指令

格式:

RET [数]返回指令的分类近返回:远返回:带弹出值返回

返回过程从栈顶弹出2个字节放入IP,如果是远返回还要弹出2个字节放入CS;如果是带弹出值的返回,还要弹出数个字节,亦即修改SP的值,SPSP+数。子程序 DATA SEGMENT DAT1 DB 02H,12H,35H,… DAT2 DB 36H,28H,67H,… RESULT DB 10DUP(?) DATA ENDS CODE SEGMENT … MOV BX,OFFSETDAT1 MOV SI,OFFSETDAT2 MOV DI,OFFSETRESULT MOV CX,10 LOP1: MOV AL,[BX]

CALL DTOB MOV DH,AH MOV AL,[SI]

CALL DTOB ADD AH,DH MOV [DI],AH INC BX INC SI INC DI LOOP LOP1例12:两组各

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论