数据传送指令
数据传送类指令

3.2.1 数据传送类指令数据传送指令用于实现寄存器与存储器之间、寄存器之间、累加器AL/AX与I/O端口之间、立即数到寄存器或存储器之间的字节或字的传送。
这类指令的共同特点是不影响标志寄存器的内容(SAHF,POPF除外)。
堆栈操作指令、标志位传送指令和地址传送指令也归入这一类中,共14条指令,又可分为4组,如表3.4所示。
1.通用数据传送指令通用数据传送指令包括传送指令MOV、堆栈操作指令PUSH、POP、输入/输出指令(累加器传送指令)、数据交换指令XCHG和查表转换指令XLAT。
这类指令是唯一允许以段寄存器作为操作数的指令(XCHG除外)。
表3.4 数据传送类指令指令类型指令书写格式指令功能通用数据传送指令MOV 目标,源PUSH 源POP 目标XCHG 目标,源XLAT 字节或字传送字压入堆栈字弹出堆栈字节或字交换字节翻译目标地址传送指令LEA 目标,源LDS 目标,源LES 目标,源装入有效地址装入DS寄存器装入ES寄存器标志位传送指令LAHFSAHFPUSHFPOPF 将FR低字节装入AH寄存器将AH内容装入FR低字节将FR内容压入堆域从堆栈弹出FR内容I/O数据传送指令IN 累加器,端口OUT 端口,累加器从端口输入字节或字将字节或字输出到端口(1)MOV 传送指令指令格式:MOV OPD,OPS指令功能:将源操作数OPS传送到目的操作数OPD,即(OPD)→(OPS)。
源操作数OPS可以是8/16位的通用寄存器、段寄存器、存储器中某单元或8/16位的立即数。
(2)PUSH进栈(压入)指令指令格式:PUSH OPS指令功能:将源操作数OPS压入堆栈,即SP–2 → SP,OPS → (SPH,SP)。
源操作数0PS可以是16位通用寄存器、段寄存器或存储器中的数据字,以保证堆栈按“字”操作。
源操作数OPS不能是立即数。
由于堆栈是按“后进先出”方式工作,所以每次执行PUSH指令时,总是首先修改栈指针(S P)–2 → SP (即SP先减2),使之指向新栈顶,然后把源操作数压入堆栈中SP所指示的位置,高字节在较高地址单元,低字节在较低地址单元中(真正的栈顶单元)。
数据传送类指令

05
06
不允许直接向段寄存器传送立即数。
该指令不影响标志位。
06
数据传送类指令
例3-12
指出下列指令中的错误 (1)MOV [DI], [SI] (2)MOV DS, 1000H (3)MOV 2000H, AX
(1)两个操作数不能同时为存 储器操作数。
(2)不能直接向段寄存器传送 立即数,正确的指令应为:
(1)在CPU内部寄存器之间 进行数据传送。
例如,MOV BL, AL MOV BX, AX MOV DS, AX
(2)在CPU内部寄存器与存 储器之间进行数据传送。
例如,MOV AX, [1000H] MOV BX, [SI][BX] MOV DATA[BP], ES
(3)将立即数传送给寄存器。 例如,MOV AX, 1234H MOV SI, 1000H
例3-14
数据传送类指令
已知:(BX)=1122H,(DS)=3000H,(31000H)=1234H。执行指令: XCHG BX, [1000H] 源操作数的物理地址为:(DS)×16+1000H=31000H。 指令执行的结果为:(BX)=1234H,(31000H)=1122H。
要实现两个存储单元X与Y之间的数据交换, 可以执行如下指令:
数据传送类指令
例3-15 已知:(DS)=3000H,(32000H)=12H,(32001H)
=34H,(32002H)=56H,(32003H)=78H。执行指令: LDS SI, [2000H]
地址传送指令
1.5 输入输出指令
数据传送类指令
输入输出指令用于在I/O端口与CPU之间传送数据。
MOV AX, 1000H MOV DS, AX (3)立即数不能作为目的操 作数。
数据传送类指令

数据传送类指令
1. 通用数据传送
2. 堆栈操作
3. 地址传送
4. 标志位传送
5. I/O数据传送
传送类指令执行后对标志位都没有影响(除SAHF、 POPF和POPFD外)。
-.通用数据传送指令
指令书写格式
指令功能
MOV REG/MEM/SEG,REG/MEM/SEG/IMM XCHG REG/MEM,REG/MEM XLAT BSWAP REG32
2009年6月2日星期二
8
PUSH/POP指令
PUSH指令:①SP-N→SP; ②16/32/64位的源操作数压入堆栈
源操作数可以是通用寄存器、段寄存器和存储器,N为源操作数的 字节数2或4或8 。 POP指令:①从栈顶弹出操作数到目标操作数;
② SP+N→SP 目标操作数可以是通用寄存器、段寄存器(CS除外)或存储器。
注意:
①不能在两个存储单元之间直接交换数据;
②段寄存器和立即数不能作为操作数。
2009年6月2日星期二
5
(3)查表转换指令XLAT
指令格式:XLAT 功能:完成一个字节的查表转换,将数据段中偏移地址为
BX/ebx/RBX与AL寄存器之和的存储单元的内容送入AL寄存器, 即:[BX+AL]→AL。 例:若(BX)=0100H,(AL)=05H,执行XLAT指令后,(AL)=2CH。 注意:由于AL只有8位,所以表的长度不能超过256字节。
2009年6月2日星期二
10
(3)PUSHAD/POPAD
386新增指令 PUSHAD指令将所有扩展通用寄存器的内容
压入堆栈,压入的顺序是:EAX、ECX、 EDX、EBX、ESP、EBP、ESI、EDI; POPAD弹出的顺序与PUSHAD压入的相反 (弹出到ESP的值被丢弃)。
第3节1数据传送指令

长格式: OUT PORT, AL (字节)
OUT PORT, AX (字)
执行操作:( PORT ) (AL)
(字节)
( PORT+1, PORT ) (AX)(字)
短格式: OUT DX, AL (字节)
OUT DX, AX (字)
执行操作:( (DX) ) (AL)
(字节)
( (DX)+1, (DX) ) (AX)(字)
SRC是源操作数,可以是寄存器、存储单元或立即数。
(1)立即数传送给通用寄存器或存储单元 例如:MOV BL,44 MOV AX,3450H MOV WORD PTR [DI],2178H MOV BYTE PTR [DI],32H
ቤተ መጻሕፍቲ ባይዱ注意
不影响标志位。 立即数、CS和IP不能 做目的操作数
(2) 通用寄存器之间相互传送 MOV SI,DI MOV AL,BH
例: IN AX, 28H MOV DATA_WORD, AX
;IN BX,28H?
例: MOV DX, 3FCH IN AX, DX
例: OUT 5, AL;与MOV 5, AL比较
例:测试某状态寄存器(端口号27H)的第2位是否为1
IN
AL, 27H
TEST AL, 00000100B
JNZ ERROR
重点关注:
• 指令的汇编格式 • 指令的基本功能 • 指令支持的寻址方式 • 指令的执行对标志位的影响 • 指令的特殊要求
3.3 8086指令系统
3.3.1数据传送指令
数据传送指令的功能是将数据、地址或立即数传送到寄存器或存储单元中。
1.通用数据传送指令 格式: MOV DST ,SRC
汇编语言程序设计基本命令

汇编语言程序设计基本命令汇编语言是一种底层的编程语言,直接操作计算机硬件,其指令由一系列的机器码组成。
在汇编语言程序设计中,我们需要了解一些基本的命令,包括数据传送指令、算术运算指令、控制转移指令等,下面就对这些命令做一详细的介绍。
1.数据传送指令在汇编语言中,数据传送指令用来将数据从一个位置复制到另一个位置,常用的数据传送指令有MOV、LEA和XCHG。
-MOV指令:将源操作数的值复制给目标操作数,格式为MOV目标操作数,源操作数。
-LEA指令:用来将有效地址(即内存中的地址)传送给寄存器,格式为LEA目标操作数,源操作数。
-XCHG指令:交换两个操作数的值,格式为XCHG目标操作数,源操作数。
2.算术运算指令在汇编语言中,我们可以使用一系列算术运算指令来对数据进行运算和处理,常见的算术运算指令有ADD、SUB、MUL和DIV等。
-ADD指令:用于进行加法运算,格式为ADD目标操作数,源操作数。
-SUB指令:用于进行减法运算,格式为SUB目标操作数,源操作数。
-MUL指令:用于进行乘法运算,格式为MUL目标操作数,源操作数。
-DIV指令:用于进行除法运算,格式为DIV目标操作数,源操作数。
控制转移指令用于改变程序的执行流程,常见的控制转移指令有JMP、JZ、JE、JNE等。
-JMP指令:用于无条件地跳转到目标地址继续执行,格式为JMP目标地址。
-JZ指令:用于当结果为零时跳转到目标地址继续执行,格式为JZ目标地址。
-JE指令:用于当结果相等时跳转到目标地址继续执行,格式为JE目标地址。
-JNE指令:用于当结果不相等时跳转到目标地址继续执行,格式为JNE目标地址。
4.逻辑运算指令逻辑运算指令用于对数据进行逻辑运算,常见的逻辑运算指令有AND、OR、XOR和NOT等。
-AND指令:对两个操作数的对应位进行与运算,格式为AND目标操作数,源操作数。
-OR指令:对两个操作数的对应位进行或运算,格式为OR目标操作数,源操作数。
数据传送指令

3.2.1数据传送指令
(4) 格式:POP DST 操作:(DST)←((SP+1),(SP)),(SP)←(SP)+2 先出栈,后指针加2,按字取出。目标操作数DST的寻址方式为 立即寻址方式之外的所有存储器操作数寻址方式和寄存器寻址
POP AX POP [BX+SI]
3.2.1数据传送指令
(5) 该指令把存储器操作数的有效地址送到指定的寄存器中。 格式: LEA REG,SRC 操作:(REG)←SRC,即把源操作数(SRC应是存储器操 作数)的有效地址送到指定的寄存器中(REG LEA DX,[BX+SI+0B62H] 执行前:(BX)=3000H,(SI)=00C3H 执行后:(DX)=3000H+00C3H+0B62H=3C25H(有效地址
操作:(AL)←[(DX)](字节);(AX)←[(DX)+1,(DX)](字)
3.2.1数据传送指令
(2)
格式Ⅰ:OUT PORT ,AL OUT PORT ,AX ;字输出
操作:(PORT) ←AL(字节);(PORT+1,PORT)←AX
格式Ⅱ:OUT AL, DX OUT AX, DX
操作:[(DX)] ←(AL)(字节),[(DX)+1,(DX)] ←(AX)(字)IN/OUT 指令有两种格式,选择哪一种,取决于 外部设备端口地址的宽度。格式Ⅰ指令有两个字节,称长格式, 格式II指令只有一个字节,称短格式。
3.2.1数据传送指令
3. (1) LAHF
格式: LAHF 操作:(AH)←(PSW的低字节),即标志寄存器 (PSW)的低字节传送到AH (2) SAHF 格式:SAHF 操作:(PSW的低字节)←(AH),即将AH 寄存器的内
数据传送类指令

【例】: 设内部RAM(30H)=40H,(40H)=10H,(10H)=00H,(P1)=0CAH,分析以 下程序执行后,各单元、寄存器、P2口的内容。
MOV R0,#30H
;R0←30H
MOV A,@R0
;A←((R0))
MOV R1,A
;R1←(A)
MOV B,@R1
;B←((R1))
MOV @R1,P1
;A←00H
MOV @DPTR,A
;((DPTR))←(A)
程序段执行后,(DPTR)=2023H,(30H)=0FH,(A)=00H,(2023H)=00H,表示 把片外RAM 2023H单元的内容0FH送到内部RAM的30H单元,然后把外部RAM 2023H单元和累加器A清0。
若采用R0和R1间接寻址,必须把高8位地址先送到P2口,上述程序段将改为:
单片机原理与应用
助记符有:MOV,MOVX,MOVC,XCH,XCHD,PUSH,POP,SWAP。 格式:MOV [目的操作数],[源操作数] 功能:目的操作数← 源操作数中的数据 源操作数可以是:A、Rn、direct、@Ri、#data 目的操作数可以是:A、Rn、direct、@Ri
注意:一般不影响标志,只有一种堆栈操作可能直接修改程序状态字 PSW。另外,如果目的操作数为ACC,将会影响奇偶标志P。
MOV A,@Ri
A←((Ri)) √ × × × Ri内容指向的地址单元中的内容送到累加器A
【例】: 设外部RAM(2023H)=0FH,执行以下程序段:
MOV DPTR,#2023H ;DPTR←2023H
MOVX A,@DPTR
;A←((DPTR))
MOV 30H,A
;30H←(A)
微机原理常用命令

一、数据传输指令它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据。
1. 通用数据传送指令MOV 传送字或字节.MOVSX 先符号扩展,再传送.MOVZX 先零扩展,再传送.PUSH 把字压入堆栈.POP 把字弹出堆栈.PUSHA 把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 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第一个操作数里)XLAT 字节查表转换.── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES 传送目标指针,把指针内容装入ES.例: 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.SAHF 标志寄存器传送,把AH内容装入标志寄存器.PUSHF 标志入栈.POPF 标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.DAA 加法的十进制调整.SUB 减法.SBB 带借位减法.DEC 减1.NEC 求反(以0 减之).CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.DAS 减法的十进制调整.MUL 无符号乘法.IMUL 整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算), AAM 乘法的ASCII码调整.DIV 无符号除法.IDIV 整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW 字节转换为字. (把AL中字节的符号扩展到AH中去)CWD 字转换为双字. (把AX中的字的符号扩展到DX中去)CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去) CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去) 三、逻辑运算指令AND 与运算.or 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL 逻辑左移.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 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS 串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS 串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS 保存串.是LODS的逆过程.REP 当CX/ECX<>0时重复.REPE/REPZ 当ZF=1或比较结果相等,且CX/ECX<>0时重复.REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态.ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD 置方向标志位.CLD 清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.七、处理机控制指令:标志处理指令CLC(进位位置0指令)CMC(进位位求反指令)STC(进位位置为1指令)CLD(方向标志置1指令)STD(方向标志位置1指令)CLI(中断标志置0指令)STI(中断标志置1指令)NOP(无操作)HLT(停机)WAIT(等待)ESC(换码)LOCK(封锁)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.8086指令系统操作数符号表示
DST->目的操作数
SRC->源操作数
TARGET->循环、转移和调用指令操作数
reg->寄存器操作数,字节或字
reg8->寄存器操作数,字节
reg16->寄存器操作数,字
mem->存储器操作数,字节或字
mem8->字节型存储器操作数
mem16->字型存储器操作数
mem32->双字型存储器操作数
acc->累加器AL或AX
seg->段寄存器
imm->立即操作数,字节或字
imm8->8位立即操作数
imm16->16位立即操作数
short_label->短标号(8位偏移量)
near_label->近标号(16位地址或偏移)
far_label->远标号(32位地址)
指令的功能——该指令能够实现何种操作。
通常指令助记符就是指令功能的英文单词或其缩写形式
指令支持的寻址方式——该指令中的操作数可以采用何种寻址方式
指令对标志的影响——该指令执行后是否对各个标志位有影响,以及如何影响
其他方面——该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等
一、数据传送类指令
1.Mov(mov目的操作数,源操作数)
目的操作数:reg、seg、mem
源操作数:reg、seg、mem、imm
注意事项:
1、立即数不能直接送入段寄存器内
2、存储器之间不能互相送数
3、段寄存器之间不能相互送数
4、目的操作数不允许用段寄存器CS
5、送数的时候需要明确是字操作还是字节操作,即源操作数和目的操作数的位数
要统一,除非目的操作数的位数大于源操作数。
(寄存器有明确的字节或字类型,
有寄存器参与的指令其操作数类型就是寄存器的类型;对于存储器单元与立即
数同时作为操作数的情况,必须显式指明;byte ptr指示字节类型,word ptr
指示字类型)
如何判断
✧两个操作数都明确了,两者必须一致
✧两个操作数有一个明确,另一个就以明确的为依据
✧两个操作数都不明确,就会出错
2.XCHG(把两个地方的数据进行互换;XCHG 目的操作数,源操作数)
目的操作数:寄存器、存储器
源操作数:寄存器、存储器
注意:
1.存储器之间不能相互传数据
2.一般目的操作数与与操作数可以互换
3.XLAT(用于查表转换;XLAT)
目的操作数和源操作数隐含
源操作数:位于地址为DS:[BX+AL]中的一个字节的数据,即(DS:[BX+AL])
目的操作数:寄存器AL
注意:
1.执行该指令前,需要先执行两条指令
Mov bx,表格的首地址偏移量
Moval,被转换码
2.换码指令执行前:在主存建立一个字节量表格,内含要转换成的目的代码;表格
首地址存放于BX,AL存放相对表格首地址的位移量
换码指令执行后:将AL寄存器的内容转换为目标代码
4.堆栈操作指令
SS段寄存器记录其段地址,堆栈只有一个出口,即当前栈顶;用堆
栈指针寄存器SP指定
✧进栈指令:Push目的操作数;
进栈指令先使堆栈指针SP减2,然后把一个字操作数存入堆栈
顶部
✧POP目的操作数;
出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指
针SP加2
注意:
1.目的操作数为mem16;reg16;seg
2.堆栈是向下生长的(即栈顶地址逐渐减小)
3.这个存储区最大地址的字单元为堆栈底部,称为栈底(bottom)
4.任何时刻存放最后一个字的存储单元地址称为栈顶(top)(SP的值)
5.栈底是不变的,栈顶是变化的
6.字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字。
7.堆栈操作遵循先进后出原则,但可用BP寻址方式随机存取堆栈中的数据。
8.POP指令的目的操作数不能为CS!!!!
应用:
保护现场:(注意进出栈的顺序)
fun:
PUSH DS
PUSH ES
PUSH AX
PUSH BX ;处理部分
POP BX
POP AX
POP ES
POP DS
RET
用堆栈交换数据(注意进出栈顺序)PUSH AX
PUSH BX
POP AX
POP BX
♌堆栈的建立和操作(代码及示意图)
5.标志寄存器传送指令(用来传送标志寄存器FLAGS的内容,方便进行对各个标志位
的直接操作)
有2对4条指令
✧低8位传送:LAHF和SAHF
✧16位传送:PUSHF和POPF
LAHF;AH←FLAGS的低字节
LAHF指令将标志寄存器的低字节送寄存器AH
SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意
SAHF;FLAGS的低字节←AH
SAHF将AH寄存器内容送FLAGS的低字节
用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志
PUSHF;(SP←SP-2;SS:[SP]←FLAGS)
栈顶指针SP先减2,PUSHF指令将标志寄存器的内容压入堆栈
POPF;(FLAGS←SS:[SP];SP←SP+2)
POPF指令将栈顶字单元内容送标志寄存器,然后栈顶指针SP加2
注意:
源操作数和目的操作数都隐含。
♌对标志位进行修改:
pushf ;保存全部标志到堆栈
pop ax ;从堆栈中取出全部标志
or ax,0100h ;设置D8=TF=1,ax其他位不变
push ax ;将ax压入堆栈
popf ;FLAGS←AX;将堆栈内容取到标志寄存器
6.地址传送指令(地址传送指令将存储器单元的逻辑地址送至指定的寄存器)
✧有效地址(偏移地址)传送指令LEA(load EA;LEA r16,mem)
将存储器操作数的有效地址传送至指定的16位寄存器中
✧指针传送指令(这两条指令主要用在串操作,mem指定主存的连续4个字节
作为逻辑地址(32位的地址指针),送入DS:[r16]或ES:[r16]) 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寄存器
♌课本P46示例
7.输入输出指令(与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地
址)
目的操作数:AX/AL
源操作数:imm8(00H-0FFH)/DX(ALL)
格式:
输入指令:
IN AL,i8;字节输入:AL←I/O端口(i8直接寻址)
IN AL,DX;字节输入:AL←I/O端口(DX间接寻址)
IN AX,i8;字输入:AX←I/O端口(i8直接寻址)
IN AX,DX;字输入:AX←I/O端口(DX间接寻址)
输出指令:
OUT i8,AL;字节输出:I/O端口←AL(i8直接寻址)
OUT DX,AL;字节输出:I/O端口←AL(DX间接寻址)
OUT i8,AX;字输出:I/O端口←AX(i8直接寻址)
OUT DX,AX;字输出:I/O端口←AX(DX间接寻址)
注意:
1.寻址外设端口的地址线为16条,端口最多为216=65536(64K)个,端口号为
0000H~FFFFH,因此,无需分段。
2.每个端口用于传送一个字节的外设数据
3.两种寻址方式:
直接寻址:只用于寻址00H~FFH前256个端口,操作数imm8表示端口号
间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号
对大于FFH的端口只能采用间接寻址方式
3.此处的立即数是地址,不是需要传输的数据!!!
4.字传送时,送低字节地址。
示例:;直接寻址,字节量输入
in al,21h
mov ah,al
in al,20h
;直接寻址,字量输入
in ax,20h
;间接寻址,字量输入
mov dx,20h
in ax,dx
三段程序完成相同的功能。