汇编指令–数据传输指令
By Minidxer | November 1, 2007
看过有人写的一片分析strlen函数源代码的文章,其中对比了C和汇编的实现的效率,C的代码当然没有问题,但是汇编代码看的我累死了……大学的知识统统还给课本了。汇编在效率上是无可厚非的,所以找了一些相关的资料,就当复习吧。先是数据传输指令:作用:数据传输指令在存贮器和寄存器、寄存器和输入输出端口之间传送数据。它又细分为通用数据传送指令,输入输出端口传送指令,目的地址传送指令和标志传送指令。
●通用数据传送指令
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
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD 先交换再累加.( 结果在第一个操作数里 )
XLAT 字节查表转换.
BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
●输入输出端口传送指令
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )
输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,范围是 0-65535.
●目的地址传送指令
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.
●标志传送指令
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
Topics:
程序开发相关 |
Tags: strlen函数, 入栈, 出栈, 存贮器, 寄存器, 效率, 数据传输, 有效地址, 标志, 汇编, 汇编指令, 目的地址, 输入输出, 输入输出端口, 通用数据
Trackbacks