加载中…
个人资料
QQ的小老虎
QQ的小老虎
  • 博客等级:
  • 博客积分:0
  • 博客访问:4,090
  • 关注人气:0
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

AT&T汇编资料

(2007-10-24 10:19:20)
标签:

杂谈

寄存器

通用                8个32位奇存器,用于处理数据
段                6个16位寄存器,用于处理内存访问
指令指针            单一的32位寄存器,指向要执行的下一条指令码
浮点数据                8个80位寄存器,指向要执行的下一条指令
控制                5个32位寄存器,用于确定处理器的操作模式
调试                8个32位寄存器,用于在调试处理时包含信息



通用寄存器
EAX                用于操作数和结果数据的累加器
EBX                指向数据内存段中的数据指针
ECX                字符串和循环操作的计数器
EDX                I/O指针
EDI                用于字符串操作的目标的数据指针
ESI                用于字符操作的源的数据指针
ESP                堆栈指针
EBP                堆栈数据指针


段寄存器 (平坦内存模式、分段模式、实地址模式)
CS                代码段
DS                数据段
SS                堆栈段
ES                附加段指针
FS                附加段指针
GS                附加段指针


控制寄存器
CR0                控制操作模式和处理
CR1                当前没有使用
CR2                内存页面错误信息
CR3                内存页面目录信息
CR4                支持处理器特性和说明处理器特性能力的标志


标志
状态标志
标志        位        名称
CF               进位标志
PF               奇偶标志
AF               辅助进位标志
ZF               零标志
SF               符号标志
OF        11        溢出标志


控制标志
标志        位        名称
TF               陷阱标志
IF               中断使能标志
IOPL        12和13        I/O特权级别标志
NT        14        嵌套任务标志
RF        16        恢复标志
VM        17        虚拟8086模式标志
VIF        19        虚拟中断标志
VIP        20        虚拟中断挂起标志
ID        21        识别标志


GNU TOOLS
rpm -qa | grep binutils
dpkg -1 | grep binutil

binutil包含
as                汇编器
ld                连接器
gcc                编译器
gdb                调试器程序
kdbg                KDE调试器
objdump                反汇编工具
gprof                简档程序
strace                程序跟踪工具




数据段
.ascii                文本字符串
.asciz                以空字符结尾的文本字符串
.byte                字节值
.double                双精度浮点数
.float                单精度浮点数
.int                32位整数
.long                32位整数(和.int相同)
.octa                16字节整数
.quad                8字节整数
.short                16位整数
.single                单精度浮点数

bss段
.comm                声明末初始化的数据的通用内存区域
.lcomm                声明末初始化的数据的本地通用内存区域







汇编指令集
(X)表于尾部可以更换
               32位
               16位
               8位

----------------------------------------------------------------
nop                空指令
----------------------------------------------------------------

----------------------------------------------------------------
CPUID                收集程序正在基其上运行的处理器信息
----------------------------------------------------------------
EXA                CPUID输出
----------------------------------------------------------------
               厂商ID(Vendor ID)字符和技术的最大CPUID选项值
               处理器类型、系列、型号和分步信息
               处理器缓存配置
               处理器序列号
               缓存配置(线程数、核心数量和物理属性)
               监视信息
80000000h            扩展的厂商ID字符器和支持的级别
80000001h            扩展的处理器类型、系列、型号和分步信息
80000002h~80000004h        扩展的处理器名称字符串
--------------------------------------------------------------


--------------------------------------------------------------
ADDL                清空堆栈参数
--------------------------------------------------------------
addl source, destination

--------------------------------------------------------------
MOV    (X)l w b        传送数据
--------------------------------------------------------------
movx source, destination

--------------------------------------------------------------
CMOV    (X)l w b        条件传送数据
--------------------------------------------------------------
cmovx source, destination

EFLAGS位    名称            描述
CF        进位(Carry)标志        数学表达式产生进位或者错位
OF        溢出(Overflow)标志    整数值过大或者过小
PF        奇偶校验(Parity)标志    寄存器包含数学操作造成的错误数据
SF        符号(Sign)标志        指出结果为正还是负
ZF        零(Zero)标志        数学操作的结果为零


指令对                    描述            EFLAGS状态
CMOVA/CMOVNBE                大于/小于或者不等于    (CF或者ZF)=0
CMOVAE/CMOVNB                大于或者等于/不小于    CF = 0
CMOVNC                    无进位            CF = 0
CMOVB/CMOVNAE                小于/不大于        CF = 1
CMOVC                    进位            CF = 1
CMOVBE/CMOVNA                小于或者等于/不大于    (CF或ZF) = 1
CMOVE/CMOVZ                等于/零            ZF = 1
CMOVNE/CMOVNZ                不等于/不为零        ZF = 0
CMOVP/CMOVPE                奇偶校验        PF = 1
CMOVNP/CMOVPO                非奇偶校验/奇偶验    PF = 0



指令对                    描述            EFLAGS状态
CMOVGE/CMOVNL                大于或者等于/不小于    (SF异域OF) = 0
CMOVL/CMOVNGE                小于/不大于或者等于    (SF民域OF) = 1
CMOVLE/CMOVNG                小于或者等于/不小于    ((SF异域OF)或ZF) = 1
CMOVO                    溢出            OF = 1
CMOVNO                    末溢出            OF = 0
CMOVS                    带符号(负)        SF = 1
CMOVNS                    无符号(非负)        SF = 0


--------------------------------------------------------------
XCHG                在两个寄存器之间或者存在内存位置之间交换值
--------------------------------------------------------------
cmovx operand1, operand2

--------------------------------------------------------------
BSWP                反转一个32位寄存器中的字节序
--------------------------------------------------------------
常应用于大小端交换
0~7位和24~31位进行交换
8~15位和16~23位交换
bswap %ebx


--------------------------------------------------------------
XADD                交换两个值并把总和存储在目标操作数中
--------------------------------------------------------------
xadd source, destination


--------------------------------------------------------------
CMPXCHG                把一个值和一个外部值进行比较,并且交换它和另一个值
--------------------------------------------------------------
cmpxchg source, destination

--------------------------------------------------------------
CMPXCHG8G            比较两个64位值并且交换它们
--------------------------------------------------------------
cmpxchg8b destination

--------------------------------------------------------------
PUSH (X) l w b            把新的数据项目存到堆栈
--------------------------------------------------------------
pushx source


--------------------------------------------------------------
POP (X) l w b            从堆栈中取回数据
--------------------------------------------------------------
popx destination


指令对                    描述
PUSHA/POPA                压入或者弹出所有16位通用寄存器
PUSHAD/POPAD                压入或者弹出所有32位通用寄存器
PUSHF/POPF                压入或者弹出EFLAGS寄存器的底16位
PUSHFD/POPFD


--------------------------------------------------------------
JMP                 跳转
--------------------------------------------------------------
jmp location

--------------------------------------------------------------
CALL                调用函数                
--------------------------------------------------------------
call address


--------------------------------------------------------------
RET                调用返回指令                
--------------------------------------------------------------

--------------------------------------------------------------
指令            描述                EFLAGS
--------------------------------------------------------------
JA            如果大于(above),刚转跳        CF = 0 与 ZF = 0
JAE            如果大于(above)或等于,则转跳    CF = 0
JB            如果小于(below),则转跳        CF = 1
JBE            如果小于(below)或等于,则转跑    CF = 1 或 ZF = 1
JC            如果进位,则转跳        CF = 1
JCXZ            如果CX寄存器为0,则跳转        
JECXZ            如果ECX寄存器为0,则跳转
JE            如果相等,则跳转            ZF = 1
JG            如果大于(greater),则跳转    ZF = 0 与 SF = OF
JGE            如果大于(greater)或等于,则跳转    SF = OF
JL            如果小于(less),则转跳        SF<>OF
JLE            如果小于(less)或者小于,则跳转    ZF = 1 或 SF <> OF
JNA            如果不大于(above),则跳转    CF = 1 或 ZF = 1
JNAE            如果不大于(above)或等于,则跳转    CF = 1
JNB            如果不小于(below),则转跳        CF = 0
JNBE            如果不小于(below)或等于,则跳转    CF = 0 与 ZF = 0
JNC            如果无进位,则转跳        CF = 0
JNE            如果不等于,则转跳        ZF = 0
JNG            如果不大于(greater),则跳转    ZF = 1 或 SF<>OF
JNGE            如果不大于(greater)或等于,则跳转 SF<>OF
JNL            如果不小于(less),则跳转        SF = OF
JNLE            如果不小于(less)或者小于,则跳转    ZF = 0 与 SF = OF
JNO            如果不溢出,则转跳        OF = 0
JNP            如果不奇偶校验,则转跳        PF = 0
JNS            如果无符号,则跳转        SF = 0
JNZ            如果非零,则跳转            ZF = 0
JO            如果溢出,则跳转            OF = 1
JP            如果奇偶校验,则转跳        PF = 1
JPE            如果偶校验,则跳出        PF = 1
JPO            如果奇偶校验,则跳转        PF = 0
JS            如果带符号,则跳转        SF = 1
JZ            如果为零,则跳转        ZF = 1
--------------------------------------------------------------
jxx address

--------------------------------------------------------------
CMP                比较指令                
--------------------------------------------------------------
cmp operand1, operand2

cmp %eax, %ebx
jeg greater


--------------------------------------------------------------
指令                描述                
--------------------------------------------------------------
CLC                清空进位标志(设置它为零)
CMC                对进位标志求反(把它改变为相反的值)
STC                设置进位标志(设置它为1)
--------------------------------------------------------------


--------------------------------------------------------------
INC                递增                
--------------------------------------------------------------

--------------------------------------------------------------
DEC                递减                            
--------------------------------------------------------------

--------------------------------------------------------------
指令                描述                
--------------------------------------------------------------
LOOP                循环直到ECX寄存器为零
LOOPE/LOOPZ            循环直到ECX寄存器为零,或者没有设置ZF标志
LOOPNE/LOOPNZ            循环直到ECX寄存器为零,或者设置了ZF标志
--------------------------------------------------------------
loop address



--------------------------------------------------------------
MOVZX                用把零值加载到EBX中 (无符号)                            
--------------------------------------------------------------
EBX:ECX
movzx source, destination


--------------------------------------------------------------
MOVSX                用把零值加载到EBX中 (带符号)                            
--------------------------------------------------------------
EBX:ECX
movsx source, destination


--------------------------------------------------------------
MOVQ                把数据传送到MMX寄存器中                            
--------------------------------------------------------------
movq source, destination


--------------------------------------------------------------
MOVDQA/MOVDQU                用于把128位数据传送到MMX寄存器中,或者是MMX寄存器传送数据                            
--------------------------------------------------------------
movdqa source, destination

--------------------------------------------------------------
FLD                用于把浮点传送入和公传送出FPU寄传器                            
--------------------------------------------------------------
fld source

--------------------------------------------------------------
FBLD                集把80位打包BCD值加载到FPU寄存器中以及从FPU寄存获取这些值
FBSTP                同上                            
--------------------------------------------------------------
fbld source


--------------------------------------------------------------
FST                用于获取FPU寄存器堆栈中顶部位置,并且把这个值放到内存位置中
FSTS                同上,单精
FSTL                同上,双精    
--------------------------------------------------------------


--------------------------------------------------------------
指令                描述
FLD1                把+1.0压入FPU堆栈中
FLDL2T                把10的对数(底数2)压入FPU堆栈中
FLDL2E                把e的对数(底数2)压入FPU堆栈中
FLDPI                把PI值压入FPU堆栈中
FLDLG2                把2的对数(底数10)压入FPU堆栈中
FLDLN2                把2的对数(底数e)压入FPU堆栈中
FLDZ                把+0.0压入FPU堆栈中
--------------------------------------------------------------


--------------------------------------------------------------
指令                描述
MOVAPS                把4个对位的打包单精度值传送到XMM寄存器或者内存
MOVUPS                把4个不对准的打包单精度值传到XMM寄传器或者内存
MOVSS                把1个单精度值传送到内存或者寄存器的低双字节
MOVLPS                把2个单精度值传送到内存或者寄存器的低四字节
MOVHPS                把2个单精度值传送到内存或者寄存器的高四字节
MOVLHPS                把2个单精度从低四字传到高四字
MOVHLPS                把2个单精度值从高四字传送到低四字
MOVSHDUP (SSE3)            从内存或者XMM寄存器传送128位值,复制2个和第4个32位数据元素
MOVSLDUP (SSE3)            从内存或者XMM寄存器传送128位值,复制第1个和第3个32位数据元素
MOVDDUP     (SSE3)            从内存或者XMM寄存器传送64位双精度浮点值,把它复制到128位XMM寄存器中
--------------------------------------------------------------


--------------------------------------------------------------
指令                转换
CVTDQ2PD            打包双字整数到打包双精度FP(XMM)
CVTDQ2PS            打包双字整数到打包单精度FP(XMM)
CVTPD2DQ            打包双精度FP到打包双字整数(XMM)
CVTPD2PI            打包双精度FP到打包双字整数(XMM)
CVTPD2PS            打包双精度FP到打包单精度FP(XMM)
CVTPI2PD            打包双字整数到打包双精度FP(XMM)
CVTPI2PS            打包双字整数到打包单精度FP(XMM)
CVTPS2DQ            打包单精度FP到打包双字速度(XMM)
CVTPS2PD            打包单精度FP到打包双精度FP(XMM)
CVTPS2PI            打包双精度FP到打包双字整数(XMM)
CVTTPD2PI            打包双精度FP到打包双字整数(XMM,截断)
CVTTPD2DQ            打包双精度FP到打包双字整数(XMM,截断)
CVTTPS2DQ            打包单精度FP到打包双字整数(XMM,截断)
CVTTPS2PI            打包单精度FP到打包双字整数(XMM,截断)
--------------------------------------------------------------



--------------------------------------------------------------
ADD    (x)            用于把两个整数相加
--------------------------------------------------------------
add source, destination


-------------------------------------------------------------
ADC    (x)            带符号或者无符号整数,
                可以把值分割为多个双字数据元素并且对每个元素执行加法操作
-------------------------------------------------------------
adc source, destination

--------------------------------------------------------------
SUB    (x)            减法的基本形式
SBB    (X)            带借位减法指令
--------------------------------------------------------------
sub source, destination


--------------------------------------------------------------
MUL    (x)            无符号乘法
IMUL    (x)            带符号乘法
--------------------------------------------------------------
mul source
imul multiplier, source, destination




--------------------------------------------------------------
DIV    (x)            无符号除法
IDIV    (x)            带符号除法
--------------------------------------------------------------
div divisor
idiv divisor


--------------------------------------------------------------
SAL                向左算述移位
SHL                向左逻辑移位
SAR                移位除法 (符号操作GOOD)
SHR                移位除法 (小心位清0和正负数)
--------------------------------------------------------------



--------------------------------------------------------------
指令                描述
ROL                向左循环移位
ROR                向右循环位移
RCL                向左循环移位,并且包含进位标志
RCR                向右循环移位,并且包含进拉标志
--------------------------------------------------------------


--------------------------------------------------------------
指令                描述
AAA                调整加法操作的结果
AAS                调整减法操作的结果
AAM                调整乘法作的结果
AAD                准备除法操作的被除数
--------------------------------------------------------------

--------------------------------------------------------------
AND                位与
NOT                位非
OR                位或
XOR                异域
TEST                检查EFLAGS寄存器,在8位、16位、32位值之间执行接位逻辑AND操作,
                并且相应地设置符号、零和奇偶校验标志,而且不修改目标值                
--------------------------------------------------------------
AND、OR、XOR指令格式
and source, destination

--------------------------------------------------------------
FSTSW                把状态寄存器读取到一个双字内存位置或者AX寄存器中
FSTCW                控制寄存器的设置加载到双字内存位置中查看设置内容
FLDCW                把双字内存值加载到控制寄存器中
FILDS                把一个双字整数值加载到FPU寄存器堆栈中
FISTS                获得寄存器堆栈顶部的值
FIST                助记符指定了S字符
FLDS/FLDL            加载内存中的单精度/双精度值
FST/FSTP            用于把ST0寄存器数据传送到另一个FPU寄存器或者数据从FPU寄存器传送到内存位置
FXCH                交换ST0寄存器和另一个FPU寄存器的值
--------------------------------------------------------------



--------------------------------------------------------------
指令                描述
FADD/FADDS            浮点加法/32位
FDIV                浮点除法
FDIVR                反向浮点除法
FMUL                浮点乘法
FSUB                浮点减法
FSUBR                反向浮点减法
--------------------------------------------------------------


--------------------------------------------------------------
指令                描述
F2XMI                计算2的乘方(次数为ST0中的值)减1
FABS                计算ST0中的值的绝对值
FCHS                改变ST0中的值的符号
FCOS                计算ST0中的值的余弦
FPATAN                计算ST0中的值的部分反正切
FPREM                计算ST0中的值除以ST1中的值部分余数
FPREM1                计算ST0中的值除以ST1中的值的IEEE部分余数
FPTAN                计算ST0中的值部分正切
FRNDINT                把ST0中的值舍入到最近的整数
FSCALE                把计算ST0乘以2的ST1次乘方
FSIN                计算ST0中的值的正弦
FSINCOS                计算ST0中的值的正弦和余弦
FSQRT                计算ST0中的值的平方根
FYL2X/FYL2X1            计算ST1*log ST0(以2为基数)
FYL2XPI                计算ST1*log(ST0+1)(以2为基数)
FSAVE                把所有FPU寄存器复制到一个108字节的内存位置
                ,然后初始化FPU状态
FRSTOR                恢复FPU时,所有FPU寄存器(包括数据寄存器)都被复为执行FSAVE指令时的状态
--------------------------------------------------------------


--------------------------------------------------------------
指令                描述
FNCLEX                清空浮点异常标志
FNSAVE                把FPU状态保存到内存中
FNSTCW                保存FPU控制寄存器
FNSTENV                把FPU操作环境保存到内存中
FSTSW                把FPU状态寄存器保存或者保存在AX寄存器中
SAHF                把AH寄存器的第0,2,4,6和7位分别传送到进位、奇偶校验、对准、零和符号标志,
                不影响EFLAGS寄存器中的其它位
FLDENV                把内存块的值加载回FPU环境中
--------------------------------------------------------------


--------------------------------------------------------------
MOVSB                传送单一字节
MOVSW                传送一个字(2字节)
MOVSL                传送一个双字(4字节)
--------------------------------------------------------------


--------------------------------------------------------------
STD                用于设置DF标志
CLD                将DF标志清零
--------------------------------------------------------------


--------------------------------------------------------------
REPE                等于时重复
REPNE                不等于时重复
REPNZ                不为零时重复
REPZ                为零时重复
--------------------------------------------------------------


--------------------------------------------------------------
LODSB                把一个字节加载到AL寄存器中
LODSW                把一个字(2字节)加载到AX寄存器中
LODSL                把一个双字(4字节)加载到EAX寄存器中
--------------------------------------------------------------



--------------------------------------------------------------
STOSB                存储AL寄存器中一个字节数据
STOSW                在座AX寄存器中一个字(2字节)的数据
STOSL                在座EAX寄存器中一个双字(4个字节)的数据
--------------------------------------------------------------

--------------------------------------------------------------
FCOM                比较ST0寄存器和ST1寄存器
FCOM ST(x)            比较ST0寄存器和另一个FPU寄存器
FCOM source            

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有