总汇编语言指令速查表 联系客服

发布时间 : 星期三 文章总汇编语言指令速查表更新完毕开始阅读

附 录

续表 指 令 功 能 指 令 形 式 TEST reg, reg TEST reg, mem TEST dst, src 与测试,dst?src据此设置标志位 TEST reg, imm TEST acc, imm TEST mem, imm VERR src VERW src WAIT WBINVD WRMSR XADD dst, src XCHG dst, src XLAT/XLATB 若src确定的段可读,1?ZF,否则0?ZF VERR reg/mem16 若src确定的段可写,1?ZF,否则0?ZF VERW reg/mem16 等待,检查挂起未屏蔽的浮点异常 写回Cache,并使之无效 (486+) EDX:EAX?MSR[ECX] (586+) dst?src,再dst+src?dst (486+) dst, src内容交换,即dst?src WAIT WBINVD WRMSR XADD reg/mem, reg XCHG reg/mem, reg XCHG acc, reg XOR reg, reg XOR reg, mem XOR dst, src 逻辑异或,dst?src?dst XOR reg, imm XOR acc, imm XOR mem, reg XOR mem, imm 周期数 影响标志位 2 1 1 1 2 7 7 1 - - Z - - - - - Z - - - 0 S Z ? P 0 2000+ 30~35 3,4 3 2 4 1 2 1 1 3 3 0 S Z ? P 0 O S Z A P C 查表换码:(E)BX+AL确定的单元值?AL XLAT

·259·

汇编语言程序设计 附录B 编程练习环境说明

1. 编程练习软件包

附带软件包x86ASM是在Microsoft的MASM 6.15软件包的基础上,加入CodeView、Win32的开发工具及Turbo C 2.0等,进行简单整理而成的,以便初学者编程练习使用。

软件包中的基本文件有: MASM.EXE 汇编程序 LINK.EXE 连接程序 ML.EXE 汇编连接程序(自动调用LINK.EXE) ML.ERR 汇编错误信息文件 LIB.EXE 子程序库管理程序 LIB16.EXE 16位子程序管理程序 LINK16.EXE 生成DOS程序的连接程序 LIB32.EXE Win32的库管理程序 LINK32.EXE 生成Win32程序的连接程序 CV目录 CodeView调试程序CV.EXE及相应的环境 INC32目录 Win32的API的函数库声明文件 LIB32目录 Win32的API的函数库 TC目录 Turbo C 2.0命令行环境和集成环境 SET2ML16.BAT ML默认使用LINK16.EXE连接程序 SET2ML32.BAT ML默认使用LINK32.EXE连接程序

使用这个软件包既可以用来练习编写DOS环境下的应用程序,也可以用来练习编写Win32环境下的应用程序。

提供TC的目的是用它来练习16位环境下汇编语言程序模块和C程序模块的连接。

2. DOS系统下的编程练习环境

真正的DOS是运行在实模式下的一个操作系统,所以DOS程序是运行在16位地址模式下的。这种模式下的程序具有这样的特点:

(1) 偏移地址是16位,所表示的偏移地址只能是0~64K-1。在默认情况下,指令处理的数据类型是16位的,但也可以处理32位数据。

(2) 应用程序可以访问所有的计算机系统资源,可以使用I/O指令直接与外设交换数据,也可以用INT指令调用DOS环境下的系统功能(DOS和BIOS)。

在DOS系统下有很多系统功能调用可用,但是这里仅将DOS环境作为编程练习的平台,所以只须如下所述的很少几个系统功能就足够了,主要解决字符的输入、输出,以及应用程序退出返回。如果读者需要开发DOS系统下的应用程序,则必须另外参阅相关的系统资料手册。

1) 编程练习所用的DOS系统调用

(1) 功能01h。从标准输入设备输入一个字符,并回显。

·260·

附 录

入口:AH=01h

出口:AL=输入字符的ASCII码

(2) 功能02h。向标准输出设备输出一个字符。 入口:AH=02h DL=待输出字符的ASCII码 出口:无

(3) 功能08h。从标准输入设备输入一个字符,无回显。 入口:AH=08h

出口:AL=输入字符的ASCII码

(4) 功能09h。输出一个字符串到标准输出设备上。 入口:AH=09h DS:DX=待输出字符串的地址(字符串须以'$'作为其结束标志) 出口:无

(5) 功能0Ah。从标准输入设备上读入字符串(以回车结束,有回显)。 入口:AH=0Ah DS:DX=输入缓冲区地址(字节0须填入允许输入字符数)。

出口:输入缓冲区字节1存放输入的字符数,字节2起存放输入的字符串 (6) 功能0Bh。检查标准输入设备上是否有字符可读。 入口:AH=0Bh

出口:AL=00h——无字符可读;FFh——有字符可读 (7) 功能4Ch。终止程序的执行,并可返回一个代码。 入口:AH=4Ch AL=返回的代码 出口:无

2) 示例程序Demo16.ASM

编写程序Demo16.ASM,输入一个字符和一个字符串,并显示。

_STACK TOS _STACK _DATA Msg C1 S2 Buffer _DATA _TEXT Start:

SEGMENT STACK 'STACK' USE16 ; 定义堆栈段

DB 2046 DUP(0) ; 堆栈区长度:2KB DW 0 ; 初始堆栈栈顶 ENDS ; 堆栈段定义结束 SEGMENT 'DATA' USE16 ; 定义数据段 DB 13, 10, 'Hello, World!', 13,10,'$' DB 13, 10, 'Character is: *', 13, 10, '$' DB 13, 10, 'Buffer content is: ' DB 9, 0, 10 DUP('*'), 13, 10, '$' ENDS ; 数据段定义结束 SEGMENT 'CODE' USE16 ; 定义代码段 ASSUME CS: _TEXT, DS:_DATA, SS:_STACK MOV AX, _DATA ; 取数据内存区段地址 MOV DS, AX ; 设置数据段寄存器 CLI ; 设置堆栈期间禁止响应中断 MOV AX, _STACK ; 取堆栈内存区段地址 MOV SS, AX ; 设置堆栈段寄存器

·261·

汇编语言程序设计 _TEXT

MOV

STI MOV MOV INT MOV INT MOV MOV MOV INT MOV MOV INT MOV MOV MOV ADD ADD MOV MOV INT MOV INT ENDS END

SP, Offset TOS DX, Offset Msg AH, 9 21h AH, 1 21h

S2-4, AL

DX, Offset C1 AH, 9 21H

DX, Offset Buffer AH, 0Ah 21h

BL, Buffer[1] BH, 0

Buffer[BX+2], '#' Buffer[0], '0' Buffer[1], '0' DX, Offset S2 AH, 9 21H

AX, 4C00h 21h Start

; 设置初始状态时的堆栈指针 ; 堆栈设置完毕允许中断

; 中断21h的9号功能,显示字符串

3) 汇编连接

须汇编成OMF格式的目标代码(.OBJ),使用LINK16.EXE连接程序。如果ML默认使用的是LINK32.EXE,那么可执行SET2ML16,(用LINK16.EXE和LIB16.EXE覆盖原来的LINK.EXE和LIB.EXE)将LINK16.EXE设置成为ML默认调用的连接程序。

ML的 /omf 选项是生成OMF格式的目标码,未指定则默认使用 /omf。 汇编:ML /c Demo16.ASM; 连接:LINK Demo16.OBJ;

或汇编、连接:ML Demo16.ASM。

; 运行结束,返回DOS ; 代码段定义结束 ; 源程序到此为止

·262·