汇编语言程序设计
格式:U 或 U 地址 或 U 地址1 地址2 功能:从代码段中指定地址进行反汇编 常用方式:
U 从上次结束的位置进行反汇编 U 地址 从指定地址开始进行反汇编 2、G(执行)命令
格式:G[=地址1][地址2]
功能:从地址1开始执行到地址2,或执行到程序结束。 常用方法:
G 从当前位置执行到程序结束 G 地址 从当前位置执行到指定地址 3、T(跟踪)命令
格式:T[=地址1][数值N]
功能:从地址1起执行N条指令后停止。 常用方法:
T 仅执行当前一条指令 4、D(显示)命令
格式:D[地址]或D[地址1 地址2] 功能:显示指定内存单元的内容 常用方法:
D 地址 从指定地址开始显示内存单元的内容
注:如果地址仅仅是偏移地址,则系统默认为数据段。 5、R(寄存器)命令 格式:R[寄存器名]
功能:显示指定寄存器的值 常用方法:
R 显示所有寄存器的值 6、Q(退出)命令 格式:Q
3.3 80x86的指令系统
学习汇编语言指令应该把握以下几点: ① 汇编指令的共性 ·双操作数指令中,两个操作数不能同为存储单元,也不能同为段寄存器,目的操作数不能为立即数。 ·单操作数指令中,操作数可以是除立即数以外的任何寻址方式 ② 指令对标志寄存器的影响
③ 各指令的格式、使用方法和注意事项 1、传送指令
- 10 -
汇编语言程序设计
1)通用传送指令
包括:MOV、PUSH、POP、XCHG
① MOV 最基本的传送指令 格式:MOV DST,SRC 执行的操作:(DST)←(SRC) 说明:
? 目的操作数不能为CS和IP
? 传送的数据可以是8位或16位,取决于操作数的形式 ? 源操作数的长度应该小于或等于目的操作数的长度 ? 所有通用传送指令都不改变标志位 例如:
MOV AX,BX √ MOV AX,[BX] √ MOV [AX],[0000H]× MOV VALUE,24H √ MOV CS,1243H ×
② PUSH、POP 堆栈操作指令 ·PUSH 进栈指令 格式:PUSH SRC 执行的操作: (SP)←(SP)-2 ((SP)+1,(SP))←(SRC) ·POP出栈指令 格式:POP DST 执行的操作:
(DST)←((SP)+1,(SP)) (SP)←(SP)+2 说明:
? PUSH和POP是字操作
? 操作数为除立即数以外的任何形式 ? POP指令不能用CS
? 常用于对寄存器值的保存和恢复
③ 交换指令XCHG
格式:XCHG OPR1,OPR2 操作:(OPR1)←→(OPR2) 说明:
? OPR表示操作数
? 两操作数中至少有一个为寄存器,但不能为段寄存器或IP
- 11 -
汇编语言程序设计
? 允许字/字节操作 如:
XCHG AX,BX √ XCHG AX,[0011H] √ XCHG BX,1 × XCHG BX,CS ×
2)累加器专用传送指令 包括:IN OUT XLAT
这组指令只限于使用AX或AL传送信息。用于与外设直接的数据传递。 ① IN输入指令 长格式:
IN AL,PORT(字节) IN AX,PORT(字) 执行的操作:
(AL)←(PORT)(字节) (AX)←(PORT+1,PORT)(字) 短格式:
IN AL,DX(字节) IN AX,DX(字) 执行的操作: (AL)←((DX))(字节) (AX)←((DX)+1,(DX))(字) ② OUT输入指令 长格式:
OUT PORT,AL(字节) OUT PORT,AX(字) 执行的操作:
(PORT)←(AL)(字节) (PORT+1,PORT)←(AX)(字) 短格式:
OUT DX,AL(字节) OUT DX,AX(字) 执行的操作: ((DX))←(AL)(字节) ((DX)+1,(DX))←(AX)(字) 说明:
? IN指令:I/O→AL或AX
? OUT指令:AL或AX → I/O
? I/O设备中前256个端口(0-FFH)端口号可使用长格式直接在指令中指定。
- 12 -
汇编语言程序设计
? 端口号>=FFH时,只能用短格式。 例如:写出下列指令:
? 把端口34H的字数据送到存储单元str中。
IN AX,34H
MOV STR,AX 或者:
MOV DX,34H IN AX,DX MOV STR,AX
? 把端口2AFH的字节数据送到存储单元str1中。
MOV DX,2AFH IN AX,DX
MOV STR1,AX
? 把存储单元STR中的字数据送到端口28H中。
MOV STR,AX OUT 28H, AX 或:
MOV STR,AX MOV DX,28H OUT DX,AX
? 把存储单元STR1中的字节数据送到端口37AH中。
MOV STR1,AX MOV DX,37AH OUT DX,AX
③换码指令XLAT(略)
3)地址传送指令
包括:LEA、LDS、LES、LSS ① LEA取有效地址指令 格式:LEA REG,SRC 操作:(REG)←SRC 注:REG为寄存器
例如:设(BX)=1200H,(SI)=1000H,(DS)=3000H,(32224H)=12H,(32225H)=34H,试比较以下两条指令的执行结果: LEA BX,[BX+SI+0024H] MOV BX,[BX+SI+0024H] ② LDS地址送DS和寄存器指令 格式:LDS REG,SRC 操作:
(REG)←(SRC) (DS)←(SRC+2) 如:
- 13 -
汇编语言程序设计
② LES地址送DS和寄存器指令 格式:LES REG,SRC 操作:
(REG)←(SRC) (ES)←(SRC+2) ③ LSS地址送DS和寄存器指令 格式:LSS REG,SRC 操作:
(REG)←(SRC) (SS)←(SRC+2)
说明: ·该组指令的操作数可以使用16位寄存器,但是不能使用段寄存器 ·源操作数可以是除立即数和寄存器以外的任何一种存储器寻址方式 ·不影响标志位
4)标志传送指令
包括:LAHF、SAHF、PUSHF、POPF ① LAHF读取标志指令(load ah with flags) 格式:LAHF
操作:(AH)←(标志寄存器FLAGS的低字节) ② SAHF设置标志指令(store ah into flags) 格式:SAHF
操作:(FLAGS的低字节)←(AH) ③ 对标志寄存器的入栈和出栈的指令 格式:PUSHF 操作:
(SP)←(SP)-2
((SP)+1,(SP))←(FLAG)
- 14 -