1.01k likes | 1.15k Views
微机原理及接口技术. 主编 梁建武. 中国水利水电出版社. 3.1 汇编语言程序设计基础. 以助记符形式表示计算机指令 助记符( mnemonic )是便于人们记忆、并能描述指令功能和指令操作数的符号 助记符是表明指令功能的英语单词或其缩写 汇编格式指令以及使用它们编写程序的规则就形成汇编语言( Assembly Language ) 汇编语言程序:用汇编语言书写的程序 汇编程序:将汇编语言程序“汇编”成机器代码目标模块的程序. 3.1.1 汇编语言特点. 汇编语言的优点: 直接控制计算机硬件部件 编写“时间”和“空间”两方面最有效程序 汇编语言的缺点:
E N D
微机原理及接口技术 主编梁建武 中国水利水电出版社
3.1 汇编语言程序设计基础 • 以助记符形式表示计算机指令 • 助记符(mnemonic)是便于人们记忆、并能描述指令功能和指令操作数的符号 • 助记符是表明指令功能的英语单词或其缩写 • 汇编格式指令以及使用它们编写程序的规则就形成汇编语言(Assembly Language) • 汇编语言程序:用汇编语言书写的程序 • 汇编程序:将汇编语言程序“汇编”成机器代码目标模块的程序
3.1.1 汇编语言特点 • 汇编语言的优点: • 直接控制计算机硬件部件 • 编写“时间”和“空间”两方面最有效程序 • 汇编语言的缺点: • 与处理器密切有关 • 需要熟悉计算机硬件系统、考虑许多细节 • 编写繁琐,调试、维护、交流和移植困难
3.1.2 8086指令系统概述 • Intel 8086指令系统共有117条基本指令 • 可分成6个功能组 • 数据传送类指令 • 算术运算类指令 • 位操作类指令 • 串操作类指令 • 控制转移类指令 • 处理机控制类指令
3.1.2 8086指令系统概述 由4部分组成: 标号:--标号表示该指令在主存中的逻辑地址 指令助记符--代表一种指令 目的操作数,源操作数--表示参与操作的对象 ;注释--对该指令或程序段功能的说明
1.数据传送类指令 数据传送指令是将源操作数传送到目标操作数,即将数据、地址或立即数从一个位置传送到存储单元中。数据传送指令是最常使用的一类指令 除标志寄存器传送指令外,均不影响标志位 指令包括:MOV,PUSH,POP,XCHG,LEA,LDS/LES,XLAT,IN,OUT
(1)传送指令MOV 立即数 通用寄存器 AX BX CX DX BP SP SI DI 存 储 器 段寄存器 CS DS ES SS 演示 • MOV reg/mem,imm • 立即数送寄存器或主存 • MOV reg/mem/seg,reg • 寄存器送(段)寄存器或主存 • MOV reg/seg,mem • 主存送(段)寄存器 • MOV reg/mem,seg • 段寄存器送寄存器或主存 举例
MOV 举例 • 例:MOV数据传送 • MOV AL, 20H • MOV AH, AL • MOV SI, 200H • MOV AX, [BX] • MOV [DI], AX • MOV AX, DS • MOV ES, AX • MOV BYTE PTR [SI],0AH • Mov WORD PTR [SI+2],0BH
注意: • 立即数、代码段寄存器CS只能作源操作数。 • IP寄存器不能作源操作数或目的操作数。 • MOV指令不能在两个存储器单元直接传送数据,也不能在两个算寄存器之间直接传送数据。 • 两个操作数的类型属性要一致。
下列指令是非法的: MOV AX,BL ;类型不一致 MOV CS,AX ;CS不能作目的操作数
(2)堆栈指令PUSH POP • 堆栈:后进先出FILO,位于堆栈段;SS段寄存器记录其段地址 • 堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定,堆栈指针寄存器SP的初值决定了所用堆栈的大小。
PUSH压入堆栈指令 • PUSH • 格式:PUSH src;src是源操作数 • 操作:SP←SP-2,SS:[SP]←src,将堆栈指针SP减2,再将src压入堆栈顶部,src为16位操作数 • 例:PUSH AX ;将AX内容压入堆栈 ;(SP)-1←AH,高地址存入高字节 ; (SP)-2←AL,低地址存入低字节 ; (SP)←(SP)-2,SP指向新栈顶 由于堆栈操作都是以字为单位进行的,所以SP总 是指向偶地址单元。
POP弹出堆栈指令 • POP • 格式:POP dest • 操作:dest←SS:[SP],SP←SP + 2,将栈顶的一个字弹出传送到dest,再将SP加2,将SP指向新的栈顶,dest 的寻址方式是除立即寻址之外的所有存储器寻址方式和寄存器寻址方式。 • 例: • POP BX ;将栈顶内容弹出到BX ;(BL)←(SP),低地址弹出到低字节 ;(BH)←(SP)+ 1,高地址弹出到高字节 ;(SP)←(SP)+ 2,SP指向新栈顶
(3)交换指令XCHG 把两个地方的数据进行互换。 格式为:XCHG OPR1,OPR2 执行操作:(OPR1)<->(OPR2) 其中OPR表示操作数。指令允许字或字节操作,386及其后继机型还允许双字操作。 XCHG指令形式 XCHG reg , reg/mem; reg <——> reg/mem 寄存器与寄存器之间对换数据。 寄存器与存储器之间对换数据。 不能在存储器与存储器之间对换数据。 不允许使用段寄存器,立即数不能作为一个操作数,不能在累加器之间进行。
(3)交换指令XCHG 举例 • 例: • MOV BX, 0ABCDH • MOV AX,0ABCDH • XCHG AX, BX ;AX与BX交换内容, ;结果:AX = 0ABCDH ;BX = 3412H
XCHG BX,[BP+SI] 如指令执行前: (BX)=6F30H,(BP)=0200H,(SI)=0046H,(SS)=2F00H,(2F246H)=4154H OPR2的物理地址=2F000+0200+0046=2F246 则指令执行后: (BX)=4145H (2F246H)=6F30H
(4)有效地址传送指令LEA 格式:LEA reg,mem 操作:(reg)←mem,将指定内存单元的偏移(有效地址)送到指定寄存器。 LEA BX,BUFFER ;将符号地址为BUFFER的存储单元 ;的偏移地址送到BX中 MOV BX,BUFFER ;将BUFFER存储单元中的内容 ;传送到BX中 MOV BX,OFFSET BUFFER ;OFFSET BUFFER 表示存储 ;单元BUFFER的偏移地址。
(4)有效地址传送指令LEA 举例 • 例: • 设:(SI)=2000H • LEA BX,[SI+3412H] • 执行指令结果将偏移地址5412H传送到BX, • 即BX=5412H
(5) LDS/LES指针传送指令 LDS r16,mem ;r16←mem, ;DS←mem+2 • LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器 LES r16,mem ;r16←mem, ;ES←mem+2 • LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器
例3.42 LES DI,[BX] 如指令执行前(DS)=B000H,(BX)=080AH,(0B080AH)=05AEH,(0B080CH)=4000H, 则指令执行后(DI)=05AEH,(ES)=4000H。 BX默认段寄存器为DS.
累加器专用传送指令: IN(input) 输入 OUT(output) 输出 XLAT(translate) 换码 这组指令只限于使用累加器EAX,AX或AL传送信息.
(6)XLAT换码指令 格式:XLAT 或XLAT table 操作:AL←[(BX)+(AL)],将AL中存放的代码转换为另一种 代码。 XLAT换码指令又称查表转换指令,它可以根据表项的序号查 处表中对应代码的内容,是将BX指定的表格中的AL指定位移 处的数据取出赋给AL。在使用该指令前,需要在存储器中建立 一个要转换成的目的代码表格table,将表格的首地址table存 放在BX寄存器,待转换代码存放在AL寄存器中,待转换代码 须为相对表格首地址的偏移量,通过(BX)+(AL)地址将读取 的代码存放到AL中,实现代码转换。XLAT换码指令默认存储 器为数据段DS。
例: 设TABLE首地址为2000H,连续区域中存放着 数字0~9对应的格雷码:18H,34H,05H,06H, 09H,0AH,0CH,11H,12H,14H,(DS)=0F000H, 执行如下程序段: LEA BX,TABLE ;将TABLE的有效地址传送给 ;BX,BX=2000H MOV AL,8 XLAT ;执行后 (AL)=12H
2.输入输出指令 输入输出指令为I/O传送指令,实现CPU与I/O端口之间的通信。CPU只限于用累加器AL或AX来传送信息。 8086用于寻址外设端口的地址线为16条,端口最多为216=65536(64K)个,端口号为0000H~FFFFH,当端口号大于256时,须将端口先装到DX寄存器中,后使用输入输出指令来传送信息。 每个端口用于传送一个字节的外设数据
(1)IN输入指令 将外设数据传送给CPU内的AL/AX 长格式为: IN AL,PORT(字节) ;PORT端口号0~255 IN AX,PORT(字) 执行的操作: (AL)←(PORT)(字节) (AX)←(PORT+1,PORT)(字) 格式为: IN AL,DX(字节) ;DX表示的端口范围达64K IN AX,DX(字) 执行的操作: (AL)←((DX))(字节) (AX)←((DX)+1,(DX))(字)
(1)IN输入指令 举例 • 例: • IN AL, 80H • ;(AL)←(80H端口),从80H端口读入字节信息存放在AL寄存器 • IN AX, DX • (AX)←[(DX+1,DX)] 从DX中装载的端口读入字信息存放在AX寄存器
(2)OUT输入指令 • 将CPU内的AL/AX数据传送给外设 • OUT PORT,AL(字节) • OUT PORT,AX(字) • (PORT)←(AL)(字节) • (PORT+1,PORT)←(AX)(字) • 短格式为: • OUT DX,AL(字节) • OUT DX,AX(字) • 执行的操作: • ((DX))←(AL)(字节) • ((DX)+1,(DX))←(AX)(字) 举例
(2)OUT输入指令 举例 例:OUT 5,AL 从AL寄存器输出一个字节到端口5。 又如: in al,21h movah,al in al,20h ;直接寻址,字节量输入 或 in ax,20h ;直接寻址,字量输入 或 mov dx,20h in ax,dx;间接寻址,字量输入
3.算术运算指令 四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算 请注意算术运算类指令对标志的影响 指令包括:ADD、ADC、INC、DAA、AAA、SUB、SBB、DEC、CMP、NEG、AAS/DAS、MUL、IMUL、DIV、IDIV、CBW、CWD、
加法指令: ADD 加法 ADC 带进位加法 INC 加1
(1) 不带进位的加法指令ADD 格式:ADD dest,src 操作:目的操作数←目的操作数+源操作数, dest←(src)+(dest),源操作数可以是立即数、寄存器或内存单元,目的操作数不可是立即数,只可以为寄存器或内存单元。源操作数和目的操作数不能同时为存储器,而且他们的类型必须一致,即同为字或字节。
(1) ADD加法指令 举例 • 例: • ADD AL, 12H • ;AL中内容和12H相加,结果放在AL中 • ADD SI, [BX+20H] • ;SI中内容和BX+20H;BX+21H所指两存储单元内容相加,结果在SI中 • ADD SI, CX • ;SI和CX内容相加,结果在SI中 • ADD [BX+SI], AX • ;BX+SI和BX+SI+1两单元内容与AX中内容相加 • ;结果在BX+SI,BX+SI+1所指单元中
ADD指令对6个状态标志均产生影响,主要是CF、ZF、OF、SF标志位。带符号数相加要考虑溢出,从ADD指令对6个状态标志均产生影响,主要是CF、ZF、OF、SF标志位。带符号数相加要考虑溢出,从 硬件角度:默认参与运算的操作数都是有符号数,当 两数的符号位相同,而和的结果相异时有溢出,则 OF=1,否则OF=0.
例3-4 已知(BX)=D75FH,指令ADD BX,8046H 执行后,标志状态各是多少? D75FH=1110 0111 0101 1111 8046H=1000 0000 0100 0110 0110 0111 1010 0101 结果:CF=1、ZF=0、PF=0(运算结果的低8位中的“1”的个数为偶数时PF=1,为奇数时,PF=0。) 、OF=1、SF=0
(2) ADC带进位的加法 ADC指令将源与目的操作数相加,再加上进位CF标志,结 果送到目的操作数。 格式: ADC DST , SRC执行的操作:(DST)←(SRC)+(DST)+CF其中CF为进位位的值。 ADC指令按状态标志的定义相应设置。ADC指令主要与 ADD配合,实现多精度加法运算。
(2) ADC带进位的加法举例 • 例: • ADC AL, 34H ;AL←(AL)+34H+(CF) • ADC AX, CX • ;AX←(AX)+(CX)+(CF) • ADC BX,[DI] ;BX←(BX)+[DI+1][DI]+(CF)
如指令执行前: (DX)=0002H,(AX)=0F365H,(BX)=0005H,(CX)=0E024H。 指令序列为: ADD AX , CX;(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0ADC DX , BX ;(DX)=0008H,SF=0,ZF=0,CF=0,OF=0,结果正确。
(3) INC加1指令 • INC指令对操作数加1(增量) • INC指令不影响进位CF标志,按定义设置其他状态标志 • INC reg/mem • ;reg/mem←reg/mem+1 • 例: • INC BX • INC BYTE PTR [BX] BX所指的字节单元+1
减法指令 SUB(subtract) 减法 SBB(subtract with borrow) 带借位减法 DEC(decrement) 减1 NEG(negate) 求补 CMP(compare) 比较
(4) SUB 不考虑借位的减法指令 SUB指令将目的操作数减去源操作数,结果送到目的操作数。 格式:SUB DST , SRC执行的操作:(DST)←(DST)-(SRC) SUB指令按照定义相应设置状态标志。 SUB减法指令形式 : SUB reg , imm/reg/mem;reg←reg-imm/reg/memSUB mem , imm/reg; mem←mem-imm/reg
(4) SUB 不考虑借位的减法指令举例 • 例: • SUB AH, 0F0H • ;AH ← (AH)- 0F0H • SUB [BX+20H], DX • ;[BX+20H] ← ([BX+20H])- (DX) • SUB AX, CX
例: SUB [SI+14H] , 0136H如指令执行前(DS)=3000H,(SI)=0040H,(30054H)=4336H, 则指令执行后:(30054H)=4200H,SF=0,ZF=0,CF=0,OF=0 例: SUB DH , [BP+4] 如指令执行前(DH)=41H,(SS)=0000H,(BP)=00E4H,(00E8H)=5AH 则指令执行后:(DH)=0E7H,SF=1,ZF=0,CF=1,OF=0
(5) SBB 考虑借位的减法指令 • SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。 • 格式:SBB DST , SRC执行的操作:(DST)←(DST)-(SRC)-CFSBB指令按照定义相应设置状态标志 • SBB指令主要与SUB配合,实现多精度减法运算 • SBB指令形式: • SBB reg,imm/reg/mem • ;reg←reg-imm/reg/mem-CF • SBB mem,imm/reg • ;mem←mem-imm/reg-CF
(5) SBB 考虑借位的减法指令举例 • 例: • MOV AX, 5678H • MOV DX, 1234H • SUB AX, 6789H ;CF = 1 • SBB DX, 1122H ;DX = 0111H
(6) DEC 减1指令 • DEC指令对操作数减1(减量) • 格式:DEC OPR • 执行的操作:(OPR)←(OPR)-1 • DEC指令不影响进位CF标志,按定义设置其他状态标志 • DEC减1指令形式: • DEC reg/mem • ;reg/mem←reg/mem-1
(7) CMP 比较指令 CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志 格式:CMP OPR1,OPR2 执行的操作:(OPR1)-(OPR2) CMP指令执行的功能与SUB指令相同,但结果不回送目的操作数 CMP比较指令形式 CMP reg , imm/reg/mem ;reg-imm/reg/mem CMP mem , imm/reg ; mem-imm/reg 执行比较指令之后,可以根据标志判断两个数是否相等、大小关系等。
(7) CMP 比较指令举例 • 例: • CMP AL, 0AH • CMP CX, DI • CMP DI, [BX+03]
(7) NEG 求补指令 NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数 格式:NEG OPR 执行的操作:(OPR)←-(OPR) 求补运算也可以表达成:将操作数按位取反后加1 NEG指令对标志的影响与用零作减法的SUB指令一样 NEG reg/mem;reg/mem←0-reg/mem