文章目录
-
- 1.汇编语言概述
- 2.8086指令集
-
- 2.1数据传送类指令
-
- 2.1.1通用数据传送指令
- 2.1.2堆栈操作指令
- 2.1.3地址传送指令
- 2.1.4其他传送类指令
- 2.2.算数运算类指令
-
- 2.2.1加法指令
- 2.2.2减法指令
- 2.2.3乘法指令
- 2.2.4除法指令
- 2.3.位操作类指令
-
- 2.3.1逻辑运算指令
- 2.3.2 移位指令
- 2.3.3循环指令
- 2.4控制转移类指令
-
- 2.4.1无条件转移指令
- 2.4.2条件转移指令
- 2.4.3循环控制指令
- 2.4.4过程调用和返回
- 2.4.5中断和返回指令
- 2.5串操作指令
-
- 2.5.1字符串传送指令MOVS
- 2.5.2字符串比较指令CMPS
- 2.5.3字符串扫描指令SCAS
- 2.5.4取字符串数据指令CMPS
- 2.5.5写字符串数据指令STOS
- 2.5.6REP重复前缀
- 2.6处理器控制类指令
-
- 2.6.1标志操作指令
- 2.6.2外部同步指令
- 2.6.3空操作
- 3.汇编语言数据
1.汇编语言概述
汇编: 源程序在计算机中不能直接被识别和执行,所以需要经过翻译,产生机器代码,这种翻译过程称为汇编;
源程序: 用汇编语言编写的程序;
助记符: 选用了一些能反映机器指令功能的单词或词组来代表该机器指令。这些选出来的单词称为助记符。
汇编语言: 是一种用于微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
- 在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码;
- 用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。
汇编程序: 是执行把汇编语言源程序翻译成机器能够识别和执行的目标程序(即二进制的机器代码程序)任务的一种系统程序;
机器语言: 用二进制代码表示,计算机能直接识别和执行的一种机器指令系统的集合;
汇编语言程序: 用汇编语言编写的源程序;
汇编程序与汇编语言程序是两个不同的概念。
指令性语句: CPU执行的语句,能够生成目标代码,核心是指令系统中的指令。
指示性语句: CPU不执行,而由汇编程序执行的语句,不生成目标代码,核心是伪指令。
- 在汇编语言中,名字后无冒号,标号后一定带冒号;
- 语句的各个组成部分间要有分隔符(常用空格or制表符);
- 标号或名字一般由字母、数字及规定的特殊字符组成,数字不可开头。字符数最长不超过31个;
- 每个指令语句必须有助记符域。
伪指令 语句的格式:
名字: 变量的符号地址,其后不加冒号;
操作数: 指示性语句中至少有一个操作数。
EX1. 先从一个简单的8086汇编语言程序示例来了解汇编语言程序的格式、结构及规范。这是一个完成将100个字的数据块从输入缓冲区搬到输出缓冲区的实例。源程序如下所示。
(1)DATA SEGMENT ;定义代码段
(2)INBUFF DW 100 DUP (?) ;输入缓冲区
(3)OUTBUFF DW 100 DUP (?) ;输出缓冲区
(4)DATA ENDS ;定义数据段结束
(5)STACKS SEGMENT PARA STACK ‘STACK’
(6)STA DB 100H DUP(?)
(7)TOP EQU LEHGTH STA
(8)STACKS ENDS
(9)CODE SEGMENT ;定义代码段
(10)ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKS
(11)START: MOV AX,DATA
(12) MOV DS, AX
(13) MOV DS, AX
(14) MOV AX, STACKS
(15) MOV SS, AX
(16) MOV SP, TOP
(17)INIT: MOV SI,OFFSET INBUFF ;设置输入缓冲区指针
(18) LEA DI,OUTBUFF ;设置输出缓冲区指针
(19) MOV CX,100 ;块长度送CX
(20) REP MOVSB ;块搬移
(21) MOV AX,4C00H ;DOS功能调用语句
(22) INT 21H
(23) CODE ENDS
(24) END START ;汇编结束
2.8086指令集
2.1数据传送类指令
传送指令把数据从一个位置传送到另一个位置,
除标志寄存器传送指令外,均不影响标志位;
按功能可分为五种(掌握):
- 通用数据传送指令:MOV
- 堆栈操作指令:PUSH、POP
- 地址传送指令:LEA
- 交换指令:XCHG、XLAT
- 输入/输出指令:IN、OUT
2.1.1通用数据传送指令
格式:
MOV dest( 目的 ), source(源) ;将一个字节或一个字操作数据从源传送至目的地址中,源内容保持不变。
① MOV REG,im ;立即数送通用寄存器
② MOV REG,REG;通用寄存器之间传送
③ MOV REG,MEM;存储器送通用寄存器
④MOV MEM,REG;通用寄存器送存储器
⑤ MOV MEM,im ;立即数送存储器
⑥MOV REG,SEG ;段寄存器送通用寄存器(含CS)
⑦MOV MEM,SEG ;段寄存器送存储器(含CS)
⑧ MOV SEG,REG ;通用寄存器送段寄存器(CS除外)
⑨ MOV SEG,MEM ;存储器送段寄存器(CS除外)
目的操作数:寄存器(REG)、存储器(MEM)和段寄存器(SEG);
源操作数:立即数(IM)、寄存器(REG)、存储器(MEM)和段寄存器(SEG)。
注意:
①MOV指令不能在两个存贮器单元之间进行数据直接传送。
②MOV指令不能在两个段寄存器之间进行数据直接传送。
③立即数不能直接传送给段寄存器。
④目的操作数不能为CS、IP。
EX2. 将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中,若AREA1和AREA2都在当前数据段中,可以用带有循环控制的数据传送程序来实现。程序如下:
MOV SI,OFFSET AREA1MOV DI,OFFSET AREA2MOV CX,100AGAIN: MOV AL,[SI]MOV [DI],ALINC SIINC DIDEC CXJNZ AGAIN
2.1.2堆栈操作指令
-
堆栈是内存中的一个特定区域,由SS的内容和SP的内容来决定;
-
堆栈操作具有“后进先出”的特点。
-
有两种指令:
PUSH OPRD (压入)
格式: PUSH OPRD
功能:将寄存器或内存单元的内容入栈。POP OPRD (弹出)
格式: POP OPRD
功能:将栈顶的一个字送到寄存器或内存
单元中。
堆栈指令中的操作数OPRD:
① SS、DS、ES
② 16位的通用寄存器
③ WORD型的MEM数
2.1.3地址传送指令
1)取有效地址指令 LEA
格式: LEA DST,SRC ;有效地址传送到寄存器
功能:把存储单元的16位有效偏移地址EA送指定的寄存器。
2)取数据段寄存器指令 LDS (Load Data Segment)
格式:LDS DST,SRC ;将双字指针送到寄存器和DS
功能:把内存4个单元的32位数,分别送到段寄存器DS和由DST指出的偏移量寄存器。
3)取附加段寄存器指令 LES(Load Extra Segment)
格式:LES DST,SRC ;将双字指针送到寄存器和ES
功能:把内存4个单元的32位数送到段寄存器ES和由DST指出的偏移量寄存器。
2.1.4其他传送类指令
1) 交换指令XCHG
格式: XCHG DEST,SOURCE
功能:两个寄存器,寄存器和内存变量之间内容的交换 。
- 段寄存器不能作为操作数;
- 源和目的不能同时为存储单元;
- 操作数不能为立即数。
2)字节交换指令BSWAP
格式:BSWAP OPRD1
功能:寄存器内部字节交换指令,将指定的32寄存器中的4个字节,通过两两交换实现反序排列。
3)查表指令(代码转换指令) XLAT
格式:XLAT
功能:AL←[(BX)+(AL)] ;本条指令完成一个字节的编码转换,转换前要先在内存中建立一个代码转换表。
(1)表格首地址: BX内容
(2)下标变量: AL内容
常用于无法用公式实现的代码转换。
本指令不影响状态标位,表格长度不超过256字节。
4)标志传送指令
功能:标志位传送指令用于了解或保存标志寄存器的内容,或设置某些标志位。
(1)读标志位LAHF FR寄存器的低8位送AH
格式:LAHF
功能:AH ←FLAGSL
(内含5个标志位CF、PF、AF、ZF、SF)。
(2)写标志位SAHF AH 送 FR寄存器的低8位
格式:SAHF
功能:FLAGL ←AH
(内含5个标志位CF、PF、AF、ZF、SF)
(3)FLAGS入栈指令 FR寄存器推入堆栈
格式:PUSHF
功能:FLAGS入栈。
(4)FLAGS出栈指令 从栈顶中弹出存入FR寄存器
格式:POPF
功能:FLAGS出栈。
入栈、出栈指令常成对使用,分别用于子程序和中断服务程序首尾,保护和恢复主程序的各个标志位。
5)输入输出指令
(1).IN输入指令
格式: IN ACC,PORT
功能:从PORT将8位或16位数据送入ACC中。
IN AL , n
IN AX , n
IN AL , DX
IN AX , DX
(2).OUT输出指令
格式: OUT PORT , ACC
功能:将累加器AL或AX的内容输出到指定的IO端口中。
OUT n , AL
OUT n , AX
OUT DX , AL
OUT DX , AX
- ACC为累加器,PORT为外设的端口地址;
- PORT的寻址方式为直接寻址或寄存器间接寻址。
2.2.算数运算类指令
- 这类指令实现加、减、乘、除运算。
- 共有两类数据:无符号数 带符号数
- 这些指令可实现字节或字的运算。
- 运算结果都会影响六个状态标志位。
2.2.1加法指令
(1)ADD 不带进位加法
格式:ADD OPRD1, OPRD2
功能:实现OPRD1和OPRD2两个操作数相加,结果放入OPRD1。
操作数:
OPRD1: REG、 MEM
OPRD2: REG、 MEM、 im
源和目的操作数不能同时为存储器,并且源和目的操作数类型要一致。影响所有的状态标志位。
(2) ADC 带进位加法
格式:ADC OPRD1, OPRD2
功能:实现OPRD1和OPRD2两个操作数以及CF相加,结果放入OPRD1。
(3) INC 增量指令
格式:INC OPRD
功能:将操作数的内容加1后,再送回该操作数中。
OPRD为REG或MEM,为无符号数。INC指令常用于在循环程序中修改地址指针和循环次数等。
(4) DAA 组合十进制加法调整
功能:对AL寄存器中的压缩BCD数加法操作的结果进行十进制调整。
(5) AAA 未组合十进制加法调整
功能:对AL寄存器中的未压缩BCD数加法操作的结果进行十进制调整。
2.2.2减法指令
(1)SUB 不带借位减法
格式:SUB OPRD1, OPRD2
功能:实现OPRD1与OPRD2两个操作数相减,结果放入OPRD1。
( 2) SBB 带借位减法
格式: SBB OPRD1, OPRD2
功能:实现OPRD1和OPRD2两个操作数相减,同时减去借位CF,结果放入OPRD1。
( 3) DEC 减量指令
格式:DEC OPRD
功能:将操作数的内容减1后,再送回该操作数中。
OPRD为REG或MEM。为无符号数。
(4) NEG 取补指令
格式:NEG OPRD
功能:对操作数取补,结果再送回。按位变反加1,OPRD为REG或MEM。
(5) CMP 比较指令
格式:CMP OPRD1, OPRD2
功能:实现OPRD1与OPRD2两个操作数相减,结果不送回。但影响标志位。R—-im、R—-M、M—-im和M—-R。
无符号比大小 CMP AX , BX
带符号数比大小 CMP AX , BX
结论为:
EX3. 若自BLOCK开始的内存缓冲区,有100个带符号的数,希望找到其中最大的一个值,并将它放到MAX单元中。
LEA BX, BLOCKMOV AX,[BX]INC BXINC BXMOV CX,99
AGAIN: CMP AX,[BX]JG NEXTMOV AX,[BX]
NEXT: INC BXINC BXDEC CXJNE AGAINMOV MAX,AXHLT
(6) DAS 压缩BCD数减法十进制调整
(7) AAS 非压缩BCD数减法十进制调整
2.2.3乘法指令
(1) MUL 无符号数乘法指令
格式:MUL SRC
功能:完成两个无符号数的相乘。
- 被乘数和乘积均为隐含寻址;
- 源操作数可以是寄存器,也可以是存储器;
- 源操作数不能是立即数;
- 源操作数是存储器时,需指明类型。
(2) IMUL 带符号数乘法指令
格式:IMUL SRC
功能:完成两个带符号数的相乘
- 可进行字节和字节、字和字的乘法运算,结果放在AX或DX、AX中。
- 本指令影响标志位CF和OF。
- 当结果的高半部分不是结果的低半部分的符号扩展时,标志位CF和OF将置位。
(3) AAM 非压缩BCD数乘法操作结果校正
功能:完成对两个非压缩BCD数乘法结果的十进制数调整。对AX做十进制调整。
2.2.4除法指令
(1) DIV 无符号数除法指令
格式:DIV SRC
功能:完成两个无符号数的相除。被除数、商和余数均为隐含寻址。
- 如果SRC=0,产生类型0的除法错中断。
- 如果结果大于寄存器可以保存的值时,也产生0型中断。
(2) IDIV 带符号数除法指令
格式:IDIV SRC
功能:完成两个带符号数的相除。被除数、商和余数均为隐含寻址
余数符号位与被除数相同。
(3) AAD 非压缩BCD数除法校正
- AAA——对AL中ASCII未压缩的十进制和进行调整;
- AAS——对AL中ASCII未压缩的十进制差进行调整;
- AAM——对AX中两个ASCII未压缩十进制相乘结果进行调整;
- AAD——在除法指令前对AX中ASCII未压缩的十进制数进行调整。
- DAA——对AL中的两个压缩十进制数相加之和进行调整,得到压缩十进制和;
- DAS——对AL中的两个压缩十进制数相减之差进行调整,得到压缩十进制差。
(4)CBW 带符号数字节扩展
功能:将AL的符号位(bit7)扩展到整个AH中
- 若AL<80H,则AH<—00H
若AL≥80H, 则AH<—FFH。
(5) CWD 带符号数字扩展
功能:将AX中的符号位(bit15)扩展到DX中
- 若AX<8000H, 则DX<—0000H
若AX≥8000H,则DX<—FFFFH。
2.3.位操作类指令
位操作指令共同点:
- 可以按二进制位进行操作;
- 逻辑运算指令按逻辑门电路的运算规则;
- 逻辑移位指令有左移和右移,移出的位都进入CF标志;
- 因移空位的补充方式不同有多种指令形式;
- 逻辑移位指令中,移动超过1次则用CL寄存器做计数器;
- 执行逻辑操作指令,CF均被清0。
2.3.1逻辑运算指令
逻辑运算指令,即按位逻辑运算。与算术运算的最大区别就是,不进位。分为: AND、OR、XOR、 NOT、 TEST
(1)AND指令 清零
格式: AND OPRD1,OPRD2
功能:OPRD1和OPRD2按位逻辑与运算。
AND指令可以进行字节操作,也可以进行字操作。常用来屏蔽某些位。
(2)OR指令 置一
格式: OR OPRD1,OPRD2
功能:OPRD1和OPRD2按位逻辑或运算。
OR指令可以进行字节操作,也可以进行字操作。OR指令常用来组合某些位。
(3)XOR指令 取反
格式: XOR OPRD1,OPRD2
功能:OPRD1和OPRD2按位逻辑异或运算。
XOR指令可以进行字节操作,也可以进行字操作。XOR指令常用来取反某些位。
(4)NOT 指令
格式: NOT OPRD
功能:对OPRD按位取反,结果送回原操作数。
操作数可以是寄存器或存贮器的内容。该指令对标志位不产生影响。
(5)TEST指令 执行AND运算
格式: TEST OPRD,im
功能:对OPRD和im按位取与,结果不送回原操作数。影响标志位。
这条指令通常是在不希望改变操作数的前提下,用来检测某一位或某几位的状态。
2.3.2 移位指令
带符号数:
(1) SAL (Shift Arithmetic Left) 算术左移
(2) SAR(Shift Arithmetic Right) 算术右移
格式:
SAL OPRD,COUNT
SAR OPRD,COUNT
功能:将OPRD中的数左移或者右移若干位。
其中,OPRD为REG或MEM;COUNT为立即数或CL。在8086中,立即数只能为1。
无符号数:
(3) SHL(Shift Logic Left) 逻辑左移
(4) SHR(Shift Logic Right) 逻辑右移
格式: SHL OPRD,COUNT
SHR OPRD,COUNT
功能:将OPRD中的数左移或者右移若干位。
其中:OPRD为REG或MEM,COUNT为im或CL。在8086中,立即数只能为1。开环移位Shift
2.3.3循环指令
小循环移位:
(1) ROL(Rotate Left) 不带CF循环左移
(2) ROR (Rotate Right) 不带CF循环右移
格式:
ROL OPRD,COUNT
ROR OPRD,COUNT
功能:将OPRD中的数循环左移或者右移若干位。
其中,OPRD为REG或MEM,COUNT为立即数或CL。在8086中,立即数只能为1.
大循环移位:
(3) RCL(Rotate through CF Left) 带CF循环左移
(4) RCR(Rotate through CF Right) 带CF循环右移
格式:
RCL OPRD,COUNT
RCR OPRD,COUNT
功能:将OPRD中的数循环左移或者右移若干位。其中:OPRD为REG或MEM,COUNT为立即数或CL。在8086中,立即数只能为1。 闭环移位Rotate
2.4控制转移类指令
转移类指令通过改变CS与IP的值或仅改变IP的值,以改变指令执行的顺序。
2.4.1无条件转移指令
格式: JMP OPRD
功能:无条件的转移到OPRD表示的目标之处。
说明:OPRD为LABEL、REG或MEM。
(1)段内直接转移
格式: JMP SHORT PTR LAB8
JMP NEAR PTR LAB16
功能:IP<—(IP)+LAB
说明:LAB8和LAB16分别是8位或16位补码
- 只修改IP的值就是段内转移。
- LAB直接出现在指令的机器码中。就是直接转移。
- 段内直接转移属于相对转移。
a.段内直接短程转移
JMP SHORT PTR LAB8
LAB8为8位补码,转移范围:-128~+127
功能:IP<—(IP)+LAB8 ;(IP)代表当前IP值。即JMP指令取走后下一条指令的地址。LAB—地址位移量
b.段内直接近程转移
JMP NEAR PTR LAB16
LAB16为16位补码,转移范围:-32768~+32767
功能:IP<—(IP)+LAB16 ;NEAR PTR可以省略。
(2) 段内间接转移
格式: JMP REG16
JMP WORD PTR MEM16
功能:IP<—(REG16) / [MEM16]
说明:转移地址为某寄存器或某内存两个连续内存单元内容。
(3)段间直接转移
格式: JMP FAR PTR LAB32
功能:IP<—直接给出的偏移地址
CS <—直接给出的段地址
说明:FAR PTR为属性运算符,表示转移是在段间进行。目标标号在其他代码段。
(4)段间间接转移
格式: JMP DWORD PTR OPRD
功能:IP <—内存中的第一字内容
CS <—内存中的第二字内容
说明:OPRD为MEM。以OPRD的寻址方式,计算出PA。访问相邻的4B单元。低字送IP,高字送CS。
2.4.2条件转移指令
格式: JCC LAB 8
功能:条件满足则转向LAB8表示的目标之处。
说明:LAB8为LABEL。属于SHORT类型
- 条件转移指令将上一条指令所设置的某些标志位的状态作为测试条件。
- 条件满足则转向指令中所指示的目的地址。
- 条件不满足则顺序执行下一条指令。
- 转移的目标地址是8位补码。地址范围:-128~+127
EX4. 求AL和BL寄存器中的两数之和。若有进位,则AH置1,否则AH清0
ADD AL,BLJC NEXTXOR AH,AHJMP DONE
NEXT: MOV AH,01H
DONE: NOP
EX5. 设某个学生的英语成绩已存放在AL寄存器中,若低于60分,则打印F(FAIL);若高于或等于85分,则打印G(GOOD);当在60分和84分之间时,打印P(PASS)。
CMP AL,60JB FAILCMP AL,85JAE GOODPASS: MOV AL,’P’JMP PRINTFAIL: MOV AL,’F’JMP PRINTGOOD: MOV AL,’G’PRINT:…
2.4.3循环控制指令
(1)循环指令LOOP
格式:LOOP DST8
功能:CX<—(CX)-1 。
若CX≠0,就转去DST8循环执行程序;
若CX=0,顺序执行后续程序。
可等价于:
DEC CX ;CX<—(CX)-1
JNZ DST8 ;ZF=0,转向dst执行
(2)相等或为零循环指令LOOPZ /LOOPE
格式: LOOPZ DST8 ;CX ≠ 0且ZF=1循环
LOOPE DST8 ;CX ≠ 0且ZF=1循环
(3)不等或不为零循环指令LOOPNZ /LOOPNE
格式:LOOPNZ DST8 ;CX ≠ 0且ZF=0循环
LOOPNE DST8 ;CX ≠ 0且ZF=0循环
说明:在LOOPE和LOOPNE两条指令中,只要两个条件中任一个不满足,循环就结束。
以上三条指令的执行步骤:CX ← (CX) - 1
检查测试条件, 若满足则转到指令中指定的短标号处; 否则, 顺序执行下一条指令。且三条指令对状态标志位均无影响。
2.4.4过程调用和返回
(1)子程序调用指令CALL
a.段内直接调用
格式: CALL NEAR PTR DISP16
操作:
SP←(SP)-1,[SP]←IPH ;保护断点
SP←(SP)-1,[SP]←IPL ;保护断点
IP←(IP)+disp16 ;转移到目标
- DST为目标地址 , 它是一个近过程名(段内的过程)
- disp16是16位带符号数,为相对偏移量
- 该指令的相对转移范围是±32K
b.段内间接调用
格式: CALL reg16/mem16
操作:
SP←(SP)-2;[SP+1, SP]←IP;
IP←reg16/mem16
其中, reg16和mem16是16位的寄存器或存储器操作数。
c.段间直接调用
格式: CALL FAR PTR DST
操作:
SP←(SP)-2,[SP+1,SP]←CS,
CS←SEG DST;
SP←(SP)-2,[SP+1, SP]←IP,
IP←OFFSET DST
- DST是一个远程过程名(其它代码段的过程)
- SEG和OFFSET是运算符, 功能为取得过程的段基址和偏移地址。
d.段间间接调用
格式: CALL mem32
操作: SP←(SP)-2,[SP+1,SP]←CS;
SP←(SP)-2,[SP+1,SP]←IP;
IP←[mem32],CS←[mem32+2]
mem32是一个32位(4字节)的存储器操作数
(2)子程序返回指令RET
格式: RET
操作:
近过程返回: IP←[SP+1,SP],SP←(SP)+2
远过程返回: IP←[SP+1,SP],SP←(SP)+2
CS←[SP+1,SP],SP←(SP)+2
2.4.5中断和返回指令
(1)双字节指令INT nnH
格式: INT nnH
功能:启动一个类型号为nn的软中断。
说明: nn是8位的,00H~FFH。
INT指令可以用来建立一系列管理程序,供系统或用户程序使用。
(2)IRET /IRETD
用在任何一种中断服务程序的末尾,以退出中断。
2.5串操作指令
字符串: String,是指一个数据块或多个字符的集合,简称“串”。
串操作: 微机经常要对字符串执行一些诸如串传送、判断两个串是否相同、查找关键字、计算串长度、修改字符参数等操作,这些操作统称为“串操作”。
隐含寻址
DS:SI—–源操作数指针
ES:DI—–目的操作数指针
CX———-字符串长度。
每次串操作后,存放操作数偏移地址的SI和DI内容将自动修改。
DF标志
如果DF=0,则SI和DI按增量修改。
如果DF=1,则SI和DI按减量修改。
2.5.1字符串传送指令MOVS
格式:
[REP]MOVS dst_string , src_string
[REP]MOVSB ; Byte
[REP]MOVSW ; Word
EX6. 将3000H:1000H地址开始的100个字节数传送到3000H:2000H开始的单元中。
MOV AX,3000H MOV DS,AX ;设立DS段首址MOV ES,AX ;设立ES段首址MOV SI,1000H ;送源串首址偏移量MOV DI,2000H ;送目的首址偏移量MOV CX,064H ;送串长度CLD ;置DF←0,使SI、DI按增量方向修改NEXT:MOVSB DEC CX ;CX减1JNZ NEXT ;64H个字节未传送完, 转NEXT继续传送, 直至传送完, 退出
2.5.2字符串比较指令CMPS
格式:
[REP]CMPS dst_string , src_string
[REP] CMPSB ; Byte
[REP] CMPSW ; Word
- 功能:将源串(DS:SI)所指存储单元内容减去目的串(ES:DI)所指存储单元内容
- 但不送结果,仅置标志位(OSZAPC位)
- 并使SI、DI自动修改指向下一单元。
- 常和重复前缀REPE/REPZ使用。
2.5.3字符串扫描指令SCAS
格式:
[REPE/REPNE] SCAS dst_string
[REPE/REPNE] SCASB ; Byte
[REPE/REPNE] SCASW ; Word
比较结果影响状态标志位。
2.5.4取字符串数据指令CMPS
格式: LODS src_string
LODSB / LODSW
2.5.5写字符串数据指令STOS
格式: [REP] STOS [ES:]dst_string
[REP] STOSB /[REP] STOSW
2.5.6REP重复前缀
REP 无条件重复前缀。
格式: REP 串指令(MOVS , STOS)
(1)重复前缀REPE 的功能
格式: REPE/REPZ CMPS/SCAS
两个数相等时才能继续串操作,若不相等则退出串操作。
(2)重复前缀REPNE 的功能
格式:REPNE/REPNZ CMPS/SCAS
两个数不相等时才能继续串操作,若相等则退出串操作。
2.6处理器控制类指令
2.6.1标志操作指令
2.6.2外部同步指令
2.6.3空操作
NOP 空操作指令
单字节 90H 单总线周期
3.汇编语言数据
- 标识符(identifier )
- 保留字(reserved word)
- 分界符(delimiter )
- 注释 (note )
保留字: 是系统预先保留下来的具有特殊含义的符号;
标号: 指令性语句的符号地址;
表达式: 由运算对象及运算符组合。
变量:在除代码段以外的其他段被定义,用来定义存放在存储单元中的数据,在汇编程序中可以修改变量的值。
- 变量表示定义数据项中第一个字节在现行段中的地址偏移量;
- 定义变量就是给变量分配存储单元,起一个名字,并为之赋初值;
- 定义变量是由伪指令完成的。
变量的三个属性:
- 段值(Segment): 变量单元所在段的段地址;
- 偏移量(Offset): 变量单元地址与段的起始地址之间的字节数;
- 类型(Type): 变量有三种类型:字节(Bytes)、字 (Word)、双字(Double Word);
标号: 标号是指令性语句的符号地址。是转移指令和调用指令的目的地址。
- 标号和变量类似,都是存储单元的地址。
- 但是,标号对应的是存储单元中存放的是指令。
- 而变量对应的是存储单元中存放的是数据
标号的三个属性:
- 段值(Segment):指令目标代码所在段的段地址;
- 偏移量(Offset):指令目标代码首字节与段的起始地址之间的字节数;
- 类型(Type):标号的类型有两种: 近(Near)、远(FAR)。
这篇只是最基础的概念
真正的实践和之前所预想的学习计划相比起来 出入较大
那就下一篇再继续补充~