第三章8086指令系统和寻址方式一.docx
- 文档编号:23378287
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:19
- 大小:152.11KB
第三章8086指令系统和寻址方式一.docx
《第三章8086指令系统和寻址方式一.docx》由会员分享,可在线阅读,更多相关《第三章8086指令系统和寻址方式一.docx(19页珍藏版)》请在冰豆网上搜索。
第三章8086指令系统和寻址方式一
第三章8086指令系统和寻址方式
(一)
3.1汇编语言程序格式
介绍两条常用指令:
MOV和ADD
•MOVdst,src;(dst)(src)
↑↑↑
助记符目的源操作数
操作数
例:
MOVAH,BLMOVAX,1234H
•ADDdst,src;(dst)(dst)+(src)
↑↑↑
助记符目的源操作数
操作数
例:
ADDAL,36HADDBX,CX
1.一个简单程序实例
;THEFORMOFANASSEMBLYLANGUAGEPROGRAM
STSEGSEGMENT
DB64DUP(?
)
STSEGENDS
;----------------------------------------
DTSEGSEGMENT
DATA1DB36H
DATA2DB4BH
SUMDB?
DTSEGENDS
;----------------------------------------
CDSEGSEGMENT
MAINPROCFAR;thisistheprogramentrypoint
ASSUMECS:
CDSEG,DS:
DTSEG,SS:
STSEG
START:
MOVAX,DTSEG;loadthedatasegmentaddress
MOVDS,AX;assignvaluetoDS
MOVAL,DATA1;getthefirstoperand
MOVBL,DATA2;getthesecondoperand
ADDAL,BL;addtheoperands
MOVSUM,AL;storeresultinlocationSUM
MOVAH,4CH;setupto
INT21H;returntoDOS
MAINENDP
CDSEGENDS
ENDSTART;thisistheprogramexitpoint
1)汇编语句组成
四个域:
[标号:
]助记符[操作数][;注释]
如:
DATA1DB36H;变量-----数据的符号地址
START:
MOVAX,DTSEG;标号-----指令的符号地址
2)伪指令(伪操作)
伪指令是汇编程序对源程序进行汇编时处理的操作命令。
伪指令不能生成机器代码,它只为汇编程序提供转换源程序的命令。
3)汇编程序的逻辑段
堆栈段数据段代码段附加段
2.程序运行步骤及生成的文件
建立,运行汇编语言程序
C>EDITMYFILE.ASM
C>MASMMYFILE.ASM
Microsoft(R)MacroAssemblerVersion5.10
Copyright(C)MicrosoftCorp1981,1988.Allrightsreserved.
Objectfilename[MYFILE.OBJ]:
Sourcelisting[NUL.LST]:
MYFILE.LST
Cross-reference[NUL.CRF]:
47962+413345Bytessymbolspacefree
0WarningErrors
0SevereErrors
C>LINKMYFILE.OBJ
Microsoft(R)OverlayLinkerVersion3.64
Copyright(C)MicrosoftCorp1983-1988.Allrightsreserved.
RunFile[MYFILE.EXE]:
ListFile[NUL.MAP]:
Libraries[.LIB]:
LINK:
warningL4021:
nostacksegment
C>MYFILE
3.常用伪操作
(1)程序结构伪操作
段定义伪操作段名SEGMENT
…
段名ENDS
过程定义伪操作过程名PROC[NEAR/FAR]
…
过程名EDP
程序开始伪操作TITLE程序名----程序说明(<60个ASCII字符)
程序结束伪操作ENDSTART
段分配伪操作ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
(2)数据类型及数据定义伪操作
•ORG指定数据的存储地址或代码段的起始地址
例:
ORG100H例:
ORG100H
DATA1DB100START:
MOVAX,BX
•DB定义字节,是唯一能定义字符串的伪操作.
;ListFileforDBExamples
000019DATA1DB25;decimalnumber
000189DATA2DB10001001B;binarynumber
000212DATA3DB12H;hexadecimalnumber
0010ORG0010H;theoffsetaddressis10h
001032353931DATA4DB‘2591’;ASCIInumber
0018ORG0018H;theoffsetaddressis18h
001800DATA5DB?
;setasideabyte
0020ORG0020H;theoffsetaddressis20h
00204D79206E616DDATA6DB‘MynameisJoe’;ASCIIcharacters
65206973204A
6F65
002E0A1002313042DATA7DB10,10H,10B,‘10B’;differentdatatypes
DW定义字
;ListFileforDWExamples
0070ORG70H
007003BADATADW954;decimal
00720954DATA9DW100101010100B;binary
0074253FDATA10DW253FH;hexadecimal
0076FFFBDATA11DW-5;negative
0080ORG80H
00800009FFFF0007000CDATA12DW9,-1,7,0CH,00100000B,100,‘HI’
002000644849
008E00700076DWDATA,DATA11
•DD定义双字
;ListFileforDDExamples
00A0ORG00A0H
00A0000003FFDATA13DD1023;decimal
00A40008965CDATA14DD10001001011001011100B;binary
00A85C2A57F2DATA15DD5C2A57F2H;hexadecimal
00AC0000002300034789DATA16DD23H,34789H,65533;miscellaneous
0000FFFD
•DQ定义4字
•DT为压缩的BCD数据分配存储单元
;ListFileforDQ,DTExamples
00C0ORG00C0H
00C0C223450000000000DATA17DQ4523C2H;hexadecimal
00C84948000000000000DATA18DQ‘HI’;ASCIIcharacters
00D00000000000000000DATA19DQ?
;nothing
00E0ORG00E0H
00E02998564379860000DATA20DT867943569829;BCD
0000
00EA0000000000000000DATA21DT?
;nothing
0000
•DUP按照给定的次数来复制某个(某些)操作数
;ListFileforDUPExamples
0100ORG0100H
01000020[DATA22DB32DUP(?
);setaside32bytes
?
?
]
0120ORG0120H
01200005[DATA23DB5DUP(2DUP(99));fill10byteswith99
0002[
63
]
]
012A0008[DATA24DW8DUP(?
);setaside8words
?
?
?
?
]
•EQU赋值伪操作·=
COUNTEQU25
COUNTER1DBCOUNT
COUNTER2DBCOUNT
TEMP=25
TEMP=TEMP+1
3.2寻址方式与机器语言转换
指令系统:
提供给用户编写程序的一组指令集
指令:
一地址指令:
INCAX
DECCX
二地址指令:
MOVAX,[2000H]
ADDAH,BL
寻址方式:
表示操作数地址的方式
IBMPC机的寻址方式
与数据有关的寻址方式
与转移地址有关的寻址方式
3.2.1与数据有关的寻址方式(7种)
以MOV指令为例
1.立即寻址方式*——操作数在指令中给出
MOVAL,5
MOVAX,3064H
*只能用于SRC字段MOV5,AL
*SRC和DST的字长一致MOVAH,3064H
2.寄存器寻址方式*——操作数在指定的寄存器中
MOVAX,BX
MOVAL,BH
*字节寄存器只有AHALBHBLCHCLDHDL
*SRC和DST的字长一致MOVAH,BX
*CS不能用MOV指令改变MOVCS,AX
3.直接寻址方式*——有效地址EA由指令直接给出
有效地址EA:
操作数的偏移地址
物理地址PA=16d(DS)+EA
例:
MOVAX,[2000H]
EA=2000H,假设(DS)=3000H,那么(PA)=32000H
(AX)=3050H
50
直接寻址方式*
*隐含的段为数据段DS
*可使用段跨越前缀
MOVAX,ES:
[2000H]
*使用变量时,要注意变量的属性
VALUEDB10
MOVAX,VALUE,MOVAL,VALUE
MOVAX,WORDPTRVALUE
*适于处理单个变量
4.寄存器间接寻址方式*——EA在基址寄存器(BX/BP)
或变址寄存器(SI/DI)中
BX,SI,DI(DS)
物理地址=16d(DS)+
BP(SS)
物理地址=16d(SS)+(BP)
MOVAX,[BX]PA=16d(DS)+(BX)
MOVES:
[BX],AXPA=16d(ES)+(BX)
MOVDX,[BP]PA=16d(SS)+(BP)
寄存器间接寻址方式*
*不允许使用AX、CX、DX存放EA
MOVAX,[CX]
*SRC和DST的字长一致
MOVDL,[SI];[BX]指示一个字节单元
MOVDX,[DI];[BX]指示一个字单元
*适于对数组、字符串、表格中的数据连续处理
5.寄存器相对寻址方式*
6.基址变址寻址方式*
MOVAX,[BX][DI]PA=(DS)×24+(BX)+(DI)
或MOVAX,[BP+DI]PA=(SS)×24+(BX)+(DI)
MOVAX,ES:
[BX][SI]PA=(ES)×24+(BX)+(SI)
*适于数组、字符串、表格的处理
*必须是一个基址寄存器和一个变址寄存器的组合
MOVAX,[BX][BP]
MOVAX,[SI][DI]
7.相对基址变址寻址方式
MOVAX,MASK[BX][SI]
或MOVAX,MASK[BX+SI]
或MOVAX,[MASK+BX+SI]
*适于堆栈处理和数组处理
寻址方式小结
例:
编写一段显示字符串STRING的程序
DATASEGMENT
STRINGDB‘HAPPYNEWYEAR!
’,0DH,0AH,‘$’
COUNTDW17
DATAENDS
(0)立即寻址
movdl,‘H’;movdl,‘H’
movah,2
int21h;显示字符‘H’
(1)直接寻址
movdl,string;movdl,‘H’
movah,2
int21h;显示字符‘H’
movdl,string+1;movdl,‘A’
movah,2
int21h;显示字符‘A’
…...
(2)寄存器间接寻址
movcx,count;movcx,17
movbx,offsetstring;string的偏址bx
next:
movdl,[bx]
movah,2
int21h;显示一个字符
incbx
loopnext;循环指令
(3)寄存器相对寻址
movcx,count;movcx,17
movsi,0
next:
movdl,string[si];movdl,[string+si]
movah,2
int21h;显示一个字符
incsi
loopnext;循环指令
(4)基址变址寻址
movcx,count;movcx,17
movbx,offsetstring;string的偏址bx
movsi,0
next:
movdl,[bx][si];movdl,[bx+si]
movah,2
int21h;显示一个字符
incsi
loopnext;循环指令
(5)DOS显示字符串功能
movdx,offsetstring;string的偏址dx
movah,9
int21h;显示一串字符
3.2.2与转移地址有关的寻址方式
用来确定转移指令及CALL指令的转向地址。
段内:
转移指令与转向的目标指令在同一代码段中,(CS)不变。
段间:
转移指令与转向的目标指令在两个代码段中,(CS)变化。
以转移(条件转移/无条件转移)指令为例
表示转移距离(称为位移量)的操作符:
▪SHORT短转移,位移量在-128~127字节之间。
JMPSHORTNEXT
▪NEAR近转移,在同一段内转移,
位移量在-32768~32767字节范围内。
JMPNEARPTRAGAIN
▪FAR远转移,表示转移距离超过±32K字节,
或是在不同段之间转移。
JMPFARPTRWAIT
1.段内直接寻址
转向的有效地址EA=
转向地址=16d(CS)+(IP)新
例:
段内直接寻址方式的示例
1060:
000DEB04JMPSHORTNEXT
IP当前值→1060:
000F……
1060:
0011……
1060:
00130207NEXT:
ADDAL,[BX]
2.段内间接寻址
转向的有效地址EA是一个寄存器或存储单元的内容。
(可用除立即数以外的任何一种数据寻址方式得到)
物理地址=16d(CS)+EA
例:
(BX)=1256H(SI)=528EHTABLE=20A2H
(DS)=2000H(232F8H)=3280H(264E4H)=2450H
JMPBX;(IP)←1256H
JMPTABLE[BX]
JMPWORDPTRTABLE[BX];(IP)←3280H
JMP[BX][SI]
JMPWORDPTR[BX][SI];(IP)←2450H
3.段间直接寻址
用指令中提供的转向段地址和偏移地址取代CS和IP
物理地址=16d(CS)+(IP)
例:
4.段间间接寻址
用存储器中的两个相继字的内容取代CS和IP。
(存储单元的地址可用除立即数和寄存器以外的任何一种
数据寻址方式得到)
物理地址=16(DS)+EA
例:
JMPDWORDPTR[INTERS+BX]
3.3IBMPC机的指令系统
1.通用数据传送指令
传送指令:
MOVDST,SRC
执行操作:
(DST)(SRC)
注意:
•
*DST不能是CS
*不影响标志位
*DST、SRC不同时为段寄存器MOVDS,ES
*立即数不能直接送段寄存器MOVDS,2000H
例:
MOVAX,DATA_SEG
MOVDS,AX
例:
MOVAL,‘E’;MOVAL,45H
例:
MOVBX,OFFSETTABLE
例:
MOVAX,Y[BP][SI]
进栈指令:
PUSHSRC
执行操作:
(SP)(SP)-2
((SP)+1,(SP))(SRC)
出栈指令:
POPDST
执行操作:
(DST)(SP)+1,(SP))
(SP)(SP)+2
堆栈:
“先进后出”的存储区,存在于堆栈段中,SP在任何
时候都指向栈顶。
注意:
*堆栈操作必须以字为单位。
*不影响标志位
*不能用立即寻址方式PUSH1234H
*DST不能是CSPOPCS
例:
假设(AX)=2107H,执行PUSHAX
例:
POPBX
例:
PUSHDS
SUBAX,AX
PUSHAX
……
……MOVAX,4C00H
RETINT21H
例:
PUSHAX
PUSHBX
…
;其间用到AX和BX寄存器
…
POPBX
POPAX
交换指令:
XCHGOPR1,OPR2
执行操作:
(OPR1)(OPR2)
注意:
*不影响标志位
*不允许使用段寄存器
例:
XCHGBX,[BP+SI];(BX)(PA)
XCHGAL,BH;(AL)(BH)
2.累加器专用传送指令(只限于使用AX或AL)
●输入指令INac,PORT;(I/OCPU)
长格式:
INAL,PORT(字节);PORT=0~FFH
INAX,PORT(字)
执行操作:
(AL)(PORT)(字节)
(AX)(PORT+1,PORT)(字)
短格式:
INAL,DX(字节);PORT>FFH
INAX,DX(字)
执行操作:
(AL)((DX))(字节)
(AX)((DX)+1,(DX))(字)
●输出指令OUTPORT,ac;(CPUI/O)
长格式:
OUTPORT,AL(字节);PORT=0~FFH
OUTPORT,AX(字)
执行操作:
(PORT)(AL)(字节)
(PORT+1,PORT)(AX)(字)
短格式:
OUTDX,AL(字节);PORT>FFH
OUTDX,AX(字)
执行操作:
((DX))(AL)(字节)
((DX)+1,(DX))(AX)(字)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 8086 指令系统 寻址 方式