知识点
1. 输入输出指令
1.1 什么是输入输出指令?
- 输入指令:输入指令IN用于从I/O端口读数据到累加器AL(或AX)中
- 输出指令:输出指令OUT用于把累加器AL(或AX)的内容写到I/O端口
注意 输入输出指令中,只有累加器AL(或AX)才能与I/O端口进行数据传送,所以这两条指令又称为累加器专用指令。
1.2 输入输出指令格式及功能
长格式:
IN acc, port
OUT acc, port
直接寻址,port为8位立即数表示的端口地址
短格式:
IN acc, DX
OUT acc, DX
寄存器间接寻址,16位端口地址由DX指出
功能:
- IN指令从端口输入一个字节到AL或输入一个字到AX中
- OUT指令从端口输入一个字到AL或输入一个字到AX中
1.3 输入输出指令的实例
MOV DX, 03B0H ; 目的操作数:DX ,寄存器寻址 源操作数:03B0H,立即寻址 语句:将16位端口地址送DX
IN AL,DX ; 寄存器间接寻址方式,从地址为03B0H的端口输入一个字节到AL
IN AX,3FH ; 直接寻址,从地址为3FH的端口输入一个字到AX
OUT 43H,AL ;直接寻址,将AL的内容输出到地址为43H的端口
OUT 44H,AX ;直接寻址,将AX的内容输出到地址为44H的端口
MOV DX,33FH ;目的操作数:DX,寄存器寻址 源操作数:333FH,立即寻址 语句:将16位端口地址33FH送DX
OUT DX,AL ;寄存器间接寻址,将AL的内容输出到地址为33FH的端口
1.4 输入输出指令的两种寻址方式及注意事项
注意1: 从上述实例中我们看到了IN指令和OUT指令的寻址方式,需要注意的是,I/O寻址方式和存储器寻址方式是不同的,不要混淆了。例如,
在存储器寻址中:
MOV DX,03B0H 中 03B0H 是立即数,在存储器寻址中由指令直接给出,是立即寻址
MOV DX, [03B0H] 中 [03B0H] 是指存储器偏移地址为03B0H中存放的内容,是直接寻址
MOV DX,AX 中AX是指寄存器AX里的值,表示把AX的值复制给DX, 是寄存器寻址
MOV DX,[AX] 中[AX] 是指 先得到寄存器AX存放的值,将这个值作为存储器的偏移地址,然后把这个偏移地址里的值复制给寄存器DX,是寄存器间接寻址
在I/O寻址中:
IN AX,3FH 中3FH是立即数,并且没有[]围起来,这是I/O寻址中的直接寻址,不要当成存储器寻址的立即数寻址
OUT DX,AL 中DX是寄存器,但这是I/O寻址中的寄存器间接寻址,不要当成存储器寻址的寄存器寻址
注意2: 采用间接寻址的IN/OUT指令只能用DX寄存器作为间接寻址寄存器
I/O指令的两种寻址方式:直接寻址、寄存器间接寻址
2. 取偏移地址指令
2.1 什么是取偏移地址指令?
取偏移地址指令是将存储器操作数的16位偏移地址送到指定的寄存器。
2.2 指令格式
指令格式:
LEA reg16,mem
LEA指令即取偏移地址指令,这里,源操作数必须是存储器操作数,目标操作数必须是16位通用寄存器。因该寄存器常用来作为地址指针,故在此最好选用4个间址寄存器之一。
2.3 取偏移地址指令的实例
LEA BX,BUFFER ;将内存单元BUFFER的偏移地址送BX
MOV AL,[BX] ;取出BUFFER的第一个数据送AL
MOV AH,[BX+1] ;取出BUFFER的第二个数据送AH
3. 其他传送类指令
指令类型 | 汇编格式 | 指令的操作 | 示例 |
字位扩展指令 | CBW | 将AL中的字节数扩展为字, 并存放在AX中。扩展的原则 是:将符号位扩展到整个高位 | MOV AL,8EH CBW ;结果:AX=FF8EH |
CWD | 将AX中的字扩展为双字,扩 展后的高16位存放在DX中。 扩展的原则与CBW指令相同 | MOV AX,438EH CWD ;结果:AX=438EH,DX=0000H | |
远地址传送指令 | LDS reg16,mem32 | mem32为内存中连续4个单 元的首地址。指令将[mem32] 和[mem32+1]单元的内容送 reg16,将[mem32+2]和 [mem32+3]单元的内存送DS | 设1234H为首的4个单元的内容 分别为:11H,22H,00H,90H, 则执行完指令: LDS SI,[1234H] :SI=2211H,DS=9000H |
LES reg16,mem32 | 指令将[mem32]和[mem32+1]单元 的内容送reg16,将[mem32+2] 和[mem32+3]单元的内容送ES | ||
标志传送指令 | LAHF | 将FLAGS低8位的内容送AH | 设SF=1,ZF=0,AF=1,PF=1; CF=0执行指令LAHF;AH各位 状态为10X1X1X0 |
SAHF | 将AH的内容送到FLAGS低8位 | ||
PUSH | 将FLAGS的内容压入堆栈中保存 | ||
POPF | 把当前栈顶的两个单元的内容弹出到FLAGS中 |