社区
单片机/工控
帖子详情
汇编的一个问题 xchg
ycwu314
2009-10-17 09:53:07
刚学汇编 有个问题不懂 xchg指令是怎样实现的?为什么它的效率会比单纯的3个mov要快那么多?先感谢各位了!
...全文
141
2
打赏
收藏
汇编的一个问题 xchg
刚学汇编 有个问题不懂 xchg指令是怎样实现的?为什么它的效率会比单纯的3个mov要快那么多?先感谢各位了!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
huqiming588
2009-12-14
打赏
举报
回复
刚开始学的时候把指令弄熟是关键!
Great_Bug
2009-10-17
打赏
举报
回复
管它是怎样实现的呢.....反正它用一个指令做到3个MOV做的事情,就会快些
Delphi 与
汇编
入门
初学 Delphi 嵌入
汇编
[1] -
汇编
语言与机器语言 初学 Delphi 嵌入
汇编
[2] -
汇编
语言关键字 初学 Delphi 嵌入
汇编
[3] - 第
一个
Delphi 与
汇编
的例子 初学 Delphi 嵌入
汇编
[4] - 寄存器在过程与函数中的使用 初学 Delphi 嵌入
汇编
[5] - 寄存器在过程与函数中的使用 - 续 初学 Delphi 嵌入
汇编
[6] - & 操作符 初学 Delphi 嵌入
汇编
[7] - 使用常量 初学 Delphi 嵌入
汇编
[8] - 8 位寄存器、16 位寄存器与 32 位寄存器 初学 Delphi 嵌入
汇编
[9] - asm 可以代替 begin 初学 Delphi 嵌入
汇编
[10] - 函数返回值与寄存器 初学 Delphi 嵌入
汇编
[11] - 用
汇编
重写
一个
Delphi 函数 初学 Delphi 嵌入
汇编
[12] - 在
汇编
代码中可以直接使用 Result 初学 Delphi 嵌入
汇编
[13] - 地址参数用 [] 取值 初学 Delphi 嵌入
汇编
[14] - 常量与变量在
汇编
中的
一个
区别 初学 Delphi 嵌入
汇编
[15] - 需要保护的寄存器 初学 Delphi 嵌入
汇编
[16] - 进制的表示方法 初学 Delphi 嵌入
汇编
[17] - 逻辑运算 初学 Delphi 嵌入
汇编
[18] - SHL 与 SHR 初学 Delphi 嵌入
汇编
[19] - Delphi 的无符号整数类型 初学 Delphi 嵌入
汇编
[20] - Delphi 的 Integer 类型 初学 Delphi 嵌入
汇编
[21] - Delphi 的其他整数类型 初学 Delphi 嵌入
汇编
[22] - 在
汇编
代码中使用记录 初学 Delphi 嵌入
汇编
[23] - LOOP 循环 初学 Delphi 嵌入
汇编
[24] -
汇编
语言的简单数据类型 初学 Delphi 嵌入
汇编
[25] - 在
汇编
中调用函数 初学 Delphi 嵌入
汇编
[26] - 大小写字母转换 初学 Delphi 嵌入
汇编
[27] -
XCHG
指令: 交换寄存器的内容 初学 Delphi 嵌入
汇编
[28] - 把 EAX 的值置为 0 的三种方法与效率 初学 Delphi 嵌入
汇编
[29] - 寄存器所能接受的数值范围 初学 Delphi 嵌入
汇编
[30] - 寄存器表
微型计算机原理和
汇编
语言 8086/8088
汇编
语言指令表
附录 B 8086/8088
汇编
语言指令表 助记符类别 指令格式 操 作 ODITSZAPC MOV MOV dst, src 从 src确定的位置取出源操作数,或把立即数形式的 src作为源操作数,送到目的操作数dst确定的位置 - - - - - - - - - PUSH PUSH src 把字操作数src入栈- - - - - - - - - POP POP dst 出栈
一个
字数据,送到操作数dst确定的位置- - - - - - - - -
XCHG
XCHG
把dst、src两个操作数中的内容互换- - - - - - - - - XLAT XLAT 以BX+AL的和作为偏移地址,从数据段
asm
汇编
语言基础知识
第一章
汇编
语言程序设计的实验环境及实验步骤 知识提要: 本章主要进行
汇编
语言实验环境及实验步骤,涉及到的知识点包括: 1、
汇编
语言源程序编写好以后, 必须经过下列几个步骤才能在机器上运行: (1) 编辑源程序(生成.ASM文件) (2)
汇编
源程序(.ASM → .OBJ) (3) 连接目标程序(.OBJ → .EXE ) (4) 调试可执行程序(使用调试程序Debug调试生成的.EXE文件) (5) 运行程序输出结果。 2、 Windows环境下的
汇编
语言集成编程环境的使用 实验一 DOS环境下的
汇编
语言编程环境使用(基础与验证型) 一、实验要求和目的 1、掌握
汇编
语言程序设计的基本方法和技能; 2、熟练掌握使用全屏幕编辑程序EDIT编辑
汇编
语言源程序; 3、熟练掌握宏
汇编
程序MASM的使用; 4、熟练掌握连接程序LINK的使用。 二、软硬件环境 1、硬件环境:微机CPU 486以上,500MB以上硬盘,32M以上内存; 2、软件环境:装有MASM 5.0、DEBUG、LINK、EDIT、CREF.EXE和EXR2BIN.EXE等应用程序。 三、实验涉及的主要知识单元 1、
汇编
语言源程序的
汇编
过程
汇编
语言源程序的
汇编
过程是是利用
汇编
程序(MASM)对已编辑好的源程序文件(.ASM)进行
汇编
,将源程序文件中以ASCII码表示的助记符指令逐条翻译成机器码指令,并完成源程序中的伪指令所指出的各种操作,最后可以建立3个文件:扩展名为 .OBJ的目标文件、扩展名为 .LST 的列表文件和扩展名为 .CRF 的交叉索引文件。目标文件是必须建立的,它包含了程序中所有的机器码指令和伪指令指出的各种有关信息,但该文件中的操作数地址还不是内存的绝对地址,只是
一个
可浮动的相对地址。列表文件(.LST)中包含了源程序的全部信息(包括注释)和
汇编
后的目标程序,列表文件可以打印输出,可供调试检查用。交叉索引文件(.CRF)是用来了解源程序中各符号的定义和引用情况的。.LST和.CRF两个文件不是必须建立的,可有有无,可以通过
汇编
时的命令加以选择。 在对源程序文件(ASM文件)
汇编
时,
汇编
程序将对ASM文件进行两遍扫描,若程序文件中有语法错误,则结束
汇编
,
汇编
程序将指出源程序中存在的错误,这时应返回编辑环境修改源程序中的错误,再经过
汇编
,直到最后得到无错误的目标程序,即OBJ文件。因此,
汇编
程序的主要功能可以概括为以下三点: (1) 检查源程序中的语法错误,并给出错误信息;(2) 产生目标程序文件(OBJ文件),并可给出列表文件(.LST文件);(3) 展开宏指令。
汇编
程序是系统提供的用于
汇编
的系统软件,目前常用的
汇编
程序有Microsoft公司推出的宏
汇编
程MASM(MACRO ASSEMBLER)和BORLAND公司推出的TASM(TURBO ASSEMBLER)两种。Microsoft公司推出有宏
汇编
程序MASM和小
汇编
程序ASM两种,二者的区别在于:MASM有宏处理功能,而ASM没有宏处理功能,因此,MASM比ASM的功能强大,但MASM需要占据较大的内存空间,当内存空间较小时(如64 KB),只能使用ASM。 2、目标程序的连接过程
汇编
后产生的目标程序(OBJ文件)并不是可执行程序文件(EXE文件),还不能直接运行,它必须通过连接程序(LINK)连接成
一个
可执行程序后才能运行。连接程序进行连接时,其输入有两个部分:一是目标文件(.OBJ),目标文件可以是
一个
也可以是多个,可以是
汇编
语言经
汇编
后产生的目标文件,也可以是高级语言(例如C语言)经编译后产生的目标文件;另一是库文件(.LIB),库文件是系统中已经建立的,主要是为高级语言提供的。连接后输出两个文件,一是扩展名为 .EXE的可执行文件,另
一个
是扩展名为 .MAP 的内存分配文件,它是连接程序的列表文件,又称为连接映像(Link Map),它给出每个段在存储器中的分配情况,该文件可有可无。连接程序给出的“无堆栈段的警告性错误”并不影响程序的运行。所以,到此为止,连接过程已经结束,可以在操作系统下执行该.EXE程序了。 3、
汇编
语言和DOS操作系统的接口 编写的
汇编
语言源程序是在DOS环境下运行时,必须了解
汇编
语言是如何同DOS操作系统接口的。 用编辑程序把源程序输入到机器中,用
汇编
程序把它转换为目标程序,用连接程序对其进行连接和定位时,操作系统为每
一个
用户程序建立了
一个
程序段前缀区PSP,其长度为256个字节,主要用于存放所要执行程序的有关信息,同时也提供了程序和操作系统的接口。操作系统在程序段前缀的开始处(偏移地址0000H)安排了一条INT 20H软中断指令。INT 20H中断服务程序由DOS提供,执行该服务程序后,控制就转移到DOS,即返回到DOS管理的状态。因此,用户在组织程序时,必须使程序执行完后能去执行存放于PSP开始处的INT 20H指令,这样便返回到DOS,否则就无法继续键入命令和程序。 DOS在建立了程序段前缀区PSP之后,将要执行的程序从磁盘装入内存。在定位程序时,DOS将代码段置于PSP下方,代码段之后是数据段,最后放置堆栈段。内存分配好之后,DOS就设置段寄存器DS和ES的值,以使它们指向PSP的开始处,即INT 20H的存放地址,同时将CS设置为PSP后面代码段的段地址,IP设置为指向代码段中第一条要执行的指令位置,把SS设置为指向堆栈的段地址,让SP指向堆栈段的栈底,然后系统开始执行用户程序。为了保证用户程序执行完后能返回到DOS状态,可使用如下两种方法。 (一)标准方法 首先将用户程序的主程序定义成
一个
FAR过程,其最后一条指令为RET。然后在代码段的主程序(即FAR过程)的开始部分用如下三条指令将PSP中INT 20H 指令的段地址及偏移地址压入堆栈: PUSH DS ;保护PSP段地址 MOV AX,0 ;保护偏移地址0 PUSH AX 这样,当程序执行到主程序的最后一条指令RET时,由于该过程具有FAR属性,故存在堆栈内的两个字就分别弹出到CS和IP,从而执行INT 20H指令,使控制返回到DOS状态。返回DOS的标志就是程序运行完后出现
一个
DOS的标识符,如C:\>。 (二)非标准方法 也可在用户的程序中不定义过程段,只在代码段结束之前(即CODE ENDS之前)增加两条语句: MOV AH,4CH INT 21H 则程序执行完后也会自动返回DOS状态。 此外,由于开始执行用户程序时,DS并不设置在用户的数据段的起始处,ES同样也不设置在用户的附加段起始处,因而在程序开始处使用以下方法重新装填DS和ES的值使其指向用户的数据段: MOV AX,段名 MOV 段寄存器名,AX ;段寄存器名可以是DS、ES、SS之一 四、实验内容与步骤 1、实验内容 编写程序,判断
一个
年份是否是闰年。 2、实验步骤
汇编
语言程序设计上机过程如图1.1所示。 图1.1
汇编
语言程序上机过程 (一)用编辑程序EDIT建立
汇编
语言源程序文件(ASM文件) 例如,编写程序,判断
一个
年份是否是闰年的
汇编
语言源程序,可以在DOS模式下用编辑程序EDIT.EXE建立
汇编
语言源程序文件ABC.ASM,注意文件名的扩展名必须是.ASM。也可以在Windows 2000或者在Windows XP环境下鼠标单击“开始”→“运行”,在“运行”中输入“CMD”进入DOS模式,运行EDIT软件,例如: C> EDIT ABC.ASM 进入EDIT的程序编辑画面时,输入
汇编
语言源程序如下: DATA SEGMENT INFON DB 0DH,0AH,'Please input a year: $' Y DB 0DH,0AH,'This is a leap year! $' N DB 0DH,0AH,'This is not a leap year! $' W DW 0 BUF DB 8 DB ? DB 8 DUP(?) DATA ENDS STACK SEGMENT 'stack' DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,SS:STACK,CS:CODE START: MOV AX,DATA MOV DS,AX LEA DX,INFON MOV AH,9 INT 21H LEA DX,BUF MOV AH,10 INT 21H MOV CL, [BUF+1] LEA DI,BUF+2 CALL DATACATE CALL IFYEARS JC A1 LEA DX,N MOV AH,9 INT 21H JMP EXIT A1: LEA DX,Y MOV AH,9 INT 21H EXIT: MOV AH,4CH INT 21H DATACATE PROC NEAR LEA SI,BUF+2 MOV BX,0 X3: MOV AL ,[SI] SUB AL ,30H MOV AH,0
XCHG
AX,BX MOV DX,10D MUL DX
XCHG
AX,BX ADD BX,AX INC SI LOOP X3 MOV W,BX RET DATACATE ENDP IFYEARS PROC NEAR PUSH BX PUSH CX PUSH DX MOV AX,W MOV CX,AX MOV DX,0 MOV BX,4 DIV BX CMP DX,0 JNZ LAB1 MOV AX,CX MOV BX,100 DIV BX CMP DX,0 JNZ LAB2 MOV AX,CX MOV BX,400 DIV BX CMP DX,0 JZ LAB2 LAB1: CLC JMP LAB3 LAB2: STC LAB3: POP DX POP CX POP BX RET IFYEARS ENDP CODE ENDS END START (二)用
汇编
程序MASM将ASM文件
汇编
成目标程序文件(OBJ文件) 当源程序建立以后,仍以ABC.ASM程序为例,我们用
汇编
程序MASM对ABC.ASM源程序文件进行
汇编
,以便产生机器码的目标程序文件ABC.OBJ,其操作步骤如下: C>MASM ABC Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981–1985,1987. All rights reserved. Object filename [ABC.OBJ]: Source listing [NUL.LST]:ABC Cross-reference [NUL.CRF]:ABC 50674 + 450574 Bytes symbol space free 0 Warning Errors 0 Severe Errors 由此可知,
汇编
程序调入后,首先显示版本号,然后出现三个提示行。 第
一个
提示行为:Object filename [ABC.OBJ]: 这是询问目标程序文件名,方括号内为机器规定的默认的文件名,通常直接按回车键,表示采用默认的文件名(如上所示),这是我们
汇编
的主要目的。 第二个提示行为: Source listing [NUL.LST]:
汇编
人名排序
对人名进行排序设计
一个
计算机
汇编
语言指令系统 1.B10READ 接收键入的人名存放在NAMEPAR中,并用空格符清除其后的单元; 2.D10STOR 把人名从NAMEPAR 传送到NAMETAB中,并用NAMECTR计数; 3.G10SORT 用气泡排序算法对人名排序,并用SWAPPED作为交换的标志控制循环结束。其中用调用子程序H10
XCHG
来交换两个人名串的位置,并设置SWAPPED标志。 4.K10DISP 显示已经排序好了的人名。
超全
汇编
速查手册.zip
新手学习编程
汇编
要用的详细命令大全 通用数据传送指令. 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
交换字或字节.( 至少有
一个
操作数为寄存器,段寄存器不可作为操作数) CMP
XCHG
比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX ) XADD 先交换再累加.( 结果在第
一个
操作数里 ) XLAT 字节查表转换.
单片机/工控
27,374
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章