【汇编入门】

寄存器学习

IA-32系列有8个32位通用寄存器,名称分别为:

4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)

一般寄存器(数据寄存器):AX、BX、CX、DX

AX:累积暂存器,"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
BX:基底暂存器,"基地址"(base)寄存器, 在内存寻址时存放基地址。
CX:计数暂存器,计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
DX:资料暂存器,总是被用来放整数除法产生的余数。

索引暂存器(变址寄存器):SI、DI

SI:来源索引暂存器
DI:目的索引暂存器
ESI/EDI分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.

堆叠、基底暂存器(指针寄存器):SP、BP

SP:堆叠指标暂存器,栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的栈顶。
BP:基底指标暂存器, 基址指针寄存器(extended base pointer),其内存放着一个指针,该指针永远指向系统栈最上面一个栈帧的底部。

EAX、ECX、EDX、EBX:为ax,bx,cx,dx的延伸,各为32位元
ESI、EDI、ESP、EBP:为si,di,sp,bp的延伸,32位元

段寄存器(特殊寄存器)

32位CPU下有六个段寄存器,它们分别有不同的功能。
CS——代码段寄存器(Code Segment Register),其值为代码段的段值。
DS——数据段寄存器(Data Segment Register),其值为数据段的段值。
ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值。
FS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。
GS——附加段寄存器(Extra Segment Register),其值为附加数据段的段值。

实地址模式下,16位段寄存器表示的是预先分配的内存区域的基址,要访问某内存段内的数据,必须使用该段寄存器和存储单元的偏移量,内存单元的逻辑地址为 “段值:偏移量”的形式。
保护模式下,段寄存器中保存的是段描述表指针。而一些段中存放着程序指令(.code段),一些段中存放着变量(.data段),还有一个堆栈段存放的是局部函数变量和函数参数。

指令寄存器(特殊寄存器)

32位CPU下将指令寄存器扩展到了16位,对应16位中的IP,32位下的指令寄存器为EIP(Instruction Pointer)。EIP中包含下一条将要执行指令的地址,某些机器指令(如jmp)能够控制EIP,使得程序分支转到一个新位置。

标志寄存器(特殊寄存器)

1.进位标志位(Carry Flag && CF):当无符号数的计算结果超出其范围时,CF被置为1, 否则CF被置为0。
2.溢出标志位(Overflow Flag && OV):当有符号数的计算结果超出其范围时,OV被置为1,否则OV被置为0。
3.符号标志位(Sign Flag && SF):算术或逻辑操作产生负结果时,SF被置为1,否则SF被置为0。
4.零标志位(Zero Flag && ZF):算数或逻辑结果产生的结果为零时,ZF被置为1,否则ZF被置为0。
5.辅助进位标志位(Auxiliary Carry Flag && AC):运算时若最低的四位产生了进位,那么AC被置为1,否则AC被置为0。
6.奇偶校验标志位(Parity Flag):目标操作数最低有效字节中的1的个数为偶数时,PF被置为1,否则PF被置为0。

寄存器:

https://blog.csdn.net/zhu2695/article/details/16813425?locationNum=4&fps=1
https://blog.csdn.net/weixin_30666943/article/details/94939504

操作指令:

https://ai-exception.blog.csdn.net/article/details/82950848

汇编操作指令学习

简单传送指令

指令中文名格式解释备注
MOV传送指令MOV DEST,SRCDEST<=SRC
XCHG交换指令XCHG OPER1,OPER2把操作数oper1的内容与操作数oper2的内容交换oper1和oper2可以是通用寄存器或存储单元,但不能同时是操作单元,也不能是立即数。

简单加减指令

指令中文名格式解释备注
ADD加法指令ADD DEST,SRCDEST<=DEST SRC两数相加
SUB减法指令SUB DEST,SRCDEST<=DEST-SRC两数相减
INC加1指令INC DESTDEST<=DEST 1
DEC减1指令DEC DESTDEST<=DEST-1
NEG取补指令NEG OPRDOPRD=0-OPRD对操作数取补(相反数)

标志寄存器及其使用

状态标志

标志中文名解释
CF(carry flag)进位标志主要反映算术运算是否产生进位或借位,若产生,则CF=1,否则CF=0
ZF零标志反映运算结果是否为0
SF(sign flag)符号标志根据运算结果的最高位,若最高位为1则SF为1,否则为0,反映了有符号数运算结果的正负(0正1负)
OF(overflow flag)溢出标志反映有符号数运算结果是否产生溢出,是置1,否置0
PF(parity flag)奇偶标志偶数置1奇数置0
AF辅助进位标志

状态标志操作指令

指令中文名格式解释
CLC(clear carry flag)清进位标志指令CLC使进位标志CF为0
STC(set carry flag)置进位标志指令STC使进位标志CF为1
CMC(complement carry flag)进位标志取反指令CMC使进位标志CF取反
LAHF(load status flags into AH register)获取状态标志操作指令LAHF把位于标志寄存器低端的5个状态标志位(p26图2.3)信息同时送到寄存器AH的对应位
SAHF(store AH into Flags)设置状态标志操作指令SAHF对标志寄存器中的低8位产生影响,使得状态标志位SF、ZF、AF、PF和CF分别成为来自寄存器AH中对应位的值,但保留位(位1、位3、位5)不受影响

带进位加减指令

指令中文名格式解释备注
ADC(add with carry)带进位加法指令ADC DEST,SRCDEST<=DEST SRC CF与add指令不同之处是要再加上进位标志cf的值
SBB(substraction with borrow)带借位减法SBB DEST,SRCDEST<=DEST-(SRC CF)与sub指令不同之处是要再减上借位标志cf的值

取有效地址指令

指令中文名格式解释备注
LEA(load effective address)取有效地址指令LEA REC,OPRD把操作数oprd的有效地址传送到操作数rec,源操作数oprd必须是一个存储器操作数,目的操作数rec必须是一个16位或32位的通用寄存器与mov指令的区别:mov:移动地址中的值lea:将地址进行移动

指令指针寄存器和简单控制转移指令

常用条件转移指令

指令中文名格式解释备注
CMP比较指令CMP DEST,SRC根据dest-src的差影响各状态标志寄存器不把dest-src的结果送入dest
JMP无条件段内直接转移指令JMP LABEL使控制无条件地转移到标号为label的位置无条件转移指令本身不影响标志

堆栈和堆栈操作

指令中文名格式解释备注
PUSH进栈指令PUSH SRC把源操作数src压入堆栈源操作数src可以是32位通用寄存器、16位通用寄存器和段寄存器,也可以是双字存储单元或者字符存储单元,还可以是立即数
POP出栈指令POP DEST从栈顶弹出一个双字或字数据到目的操作数如果目的操作数是双字的,那么就从栈顶弹出一个双字数据,否则,从栈顶弹出一个字数据,出栈至少弹出一个字(16位)
PUSHA16位通用寄存器全进栈指令PUSHA将所有8个16位通用寄存器的内容压入堆栈压入顺序是AX CX DX BX SP BP SI DI,然后对战指针寄存器SP的值减16,所以SP进栈的内容是PUSHA指令执行之前的值
POPA16位通用寄存器全出栈指令POPA以PUSHA相反的顺序从堆栈中弹出内容,从而恢复PUSHA之前的寄存器状态SP的值不是由堆栈弹出的,而是通过增加16来恢复
PUSHAD32位通用寄存器全进栈指令PUSHAD将所有8个32位通用寄存器的内容压入堆栈压入顺序是EAX ECX EDX EBX ESP EBP ESI EDI,然后对战指针寄存器SP的值减32,所以SP进栈的内容是PUSHAD指令执行之前的值
POPAD32位通用寄存器全出栈指令POPAD以PUSHAD相反的顺序从堆栈中弹出内容,从而恢复PUSHAD之前的寄存器状态ESP的值不是由堆栈弹出的,而是通过增加32来恢复

过程调用和返回指令

指令中文名格式解释备注
CALL过程调用指令CALL LABEL段内直接调用LABEL与jmp的区别在于call指令会在调用label之前保存返回地址(call 中return之后主程序还可以继续执行,jmp 当label执行完毕后不能返回主程序继续执行)
RET段内过程返回指令RET使子程序结束,继续执行主程序

算术逻辑运算指令

指令中文名
MUL无符号数乘法指令
IMUL有符号数乘法指令
IMUL DEST,SRC有符号数乘法指令
IMUL DEST,SRC1,SRC2有符号数乘法指令
DIV无符号数除法指令
IDIV OPRD有符号数除法指令

符号拓展指令

指令中文名格式解释
CBW字节转化为字指令CBW把寄存器AL中的值符号拓展到寄存器AH
CWD字转化为双字指令CWD把寄存器AX中的值符号拓展到寄存器DX
CDQ双字转化为四字指令CDQ把寄存器EAX中的值符号拓展到EDX
CWDE字转化为双字指令CWDE把AX中的值符号拓展到EAX的高16位

拓展传送指令

指令中文名格式解释备注
MOVSX符号拓展传送指令MOVSX DEST,SRC把源操作数SRC符号拓展后送至目的操作数DESTsrc可以是通用寄存器或者存储单元,但是dest只能是通用寄存器(零拓展传送指令不会改变源操作数,也不影响标志寄存器的状态)
MOVZXMOVZX DEST,SRC把源操作数SRC零拓展后送至目的操作数DEST零拓展传送指令不会改变源操作数,也不影响标志寄存器的状态

逻辑运算指令

指令中文名格式解释备注
NOT否运算指令NOT OPRD把操作数OPRD按位取反,然后送回OPRD
AND与运算指令AND DEST,SRC把两个操作数进行与运算之后结果送回DEST同1得1,否则得0
OR或运算指令OR DEST,SRC把两个操作数进行或运算之后结果送回DEST同0得0,否则得1
XOR异或运算XOR DEST,SRC把两个操作数进行异或运算之后结果送回DEST相同得0不同得1
TEST测试指令TEST DEST,SRC与AND指令类似,将各位相与,但是结果不送回DEST,仅影响状态位标志,指令执行后,ZF、PF、SF反映运算结果,CF和OF被清零通常用于检测某些位是否为1,但又不希望改变操作数的值

移位指令

一般移位指令

指令中文名格式解释备注
SAL算术左移SAL OPRD,count把操作数oprd左移count位,右边补0与shl指令一样,通过截取count的低5位,实际的移位数被限于0到31之间。
SHL逻辑左移SHL OPRD,count把操作数oprd左移count位,右边补0与sal指令一样,通过截取count的低5位,实际的移位数被限于0到31之间。
SAR算术右移SAR OPRD,count把操作数oprd右移count位,同时每右移一位,左边补符号位,移出的最低位进入标志位CF通过截取count的低5位,实际的移位数被限于0到31之间。
SHR逻辑右移SHR OPRD,count把操作数oprd右移count位,左边补0,移出的最低位进入标志位CF通过截取count的低5位,实际的移位数被限于0到31之间。

循环移位指令

指令中文名格式解释备注
ROL左循环移位指令ROL OPRD,count通过截取count的低5位,实际的移位数被限于0到31之间。
ROR右循环移位指令ROR OPRD,count通过截取count的低5位,实际的移位数被限于0到31之间。
RCL带进位左循环移位RCL OPRD,count相当于CF在最高位参与循环移位大循环左移,通过截取count的低5位,实际的移位数被限于0到31之间。
RCR带进位右循环移位RCR OPRD,count相当于CF在最高位参与循环移位大循环右移,通过截取count的低5位,实际的移位数被限于0到31之间。

循环指令

指令中文名格式解释备注
LOOP计数循环指令LOOP LABEL使ECX的值减1,当ECX的值不为0的时候跳转至LABEL,否则执行LOOP之后的语句
LOOPE等于循环指令LOOPE LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于1(表示相等),那么就转移到LABEL,否则执行LOOPE之后的语句
LOOPZ零循环指令LOOPZ LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于1(表示相等),那么就转移到LABEL,否则执行LOOPZ之后的语句
LOOPNE不等于循环指令LOOPE LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于0(表示不相等),那么就转移到LABEL,否则执行LOOPNE之后的语句
LOOPNZ非零循环指令LOOPNZ LABEL使ECX的值减1,如果结果不等于0并且零标志ZF等于0(表示不相等),那么9就转移到LABEL,否则执行LOOPNZ之后的语句
JECXZ计数转移指令JECXZ LABEL当寄存器ECX的值为0时转移到LABEL,否则顺序执行通常在循环开始之前使用该指令,所以循环次数为0时,就可以跳过循环体
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值