关于汇编

32位通用寄存器

名字 功能(可以不管) 编号
EAX 累加器 0
ECX 计数 1
EDX I/0指针 2
EBX DS段的数据指针 3
ESP 栈堆指针 4
EBP SS段的数据指针 5
ESI 字符串操作的源指针,SS段的数据指针 6
EDI 字符串的操作的目标,ES段的数据指针 7
寄存器EIP是存了当前程序运行到的位置的地址.
汇编指令是操作码和操作数(里面包括了目标操作数喝源操作数)组成
一些指令
MOV,ADD,SUB,PUSH,POP,CALL,NOP,XOR,OR,ADC(这个就是带进制的加,也就是如果标志寄存器C的值如果是1,运算之后的结果还有加1,操作的宽度要一样).SBB(是两个减然后看C如果是1,结果还要减1.)XCHG(交换两个值,不能交换两个内存的值),MOVS(移动数据,内存和内存之间的移动)
STOS(将AL,AX,EAX的值存到EDI里面,由数据宽度决定)
REP(重复指令,根据ECX的值来决定重复执行次数)
JMP:修改EIP的值(源指令MOV EIP )
CALL:会改变ESP,返回给EIP这个CALL的返回地址
CMP:比较两个值.对标志寄存器的影响和SUB一样
TEST:将两个值进行与,结果不保存,只影响标志位寄存器
JCC
JE(jump if equal):两个数相等跳转
JZ(jump zerp flag):Z位=1就跳转
JNE(jump if not equal):不等跳转
JNZ(jump not zero flag):z!=0跳转.
JS(jump sign flag):s位=1(负号)跳转.
JNS:s!=1跳转
JP(jump p位标志寄存器):p=1跳
其他的大概类似了
额外的
JB(JNAE)小于跳转(无符号)CF=1
JNB(JAE)大于等于跳转(无符号)CF=0
JBE(JNA)小于等于跳转(无符号)CF=1或ZF=1
JNBE(JA)大于跳转(无符号)CF=0且ZF=0
JL(JNGE)小于跳转(有符号)SF!=OF
JNL(JGE)大于等于跳转(有符号)SF=OF
JLE(JNG)小于等于跳转(有符号)ZF=1或SF!=OF
JNLE(JG)大于跳转(有符号)ZF=0且SF=OF
16位寄存器
AX,CX,DX.BX.SP,BP,SI,DI(AX包含再EAX其他的同样)比如:
8位寄存器
AL,CL,DL.BL,AH,CH,DH,BH(如上图,AX包括了AH,AL其他的同样,H表示高位,L表示低位)
ptr
指的是point代表后面是一个指针(也就是C里面的指针).
规范写法
mov word(这里是规范了数据长度可用的有byte word dword等等) ptr DS(段寄存器): [地址],立即数
标志寄存器

各个标志寄存器的作用

CF(carry flag)
如果运算的时候最高位()产生了进位或者借位,那么CF的值就是1.
PF(parity flag)
就是判断1的奇偶数(转到二进制),偶数个1就是1.看的是最低有效数据宽度(就看最后两位里面还有多少个1)
AF(Auxiliary carry flag)
字操作,低字节想高字节进位或者借位了,AF是1
字节操作,低四位向高四位进位或借位,AF是1
ZF(zero flag)
用来反应运算的结果是不是0,是0变1,不是1变0;这个通常用在判断里面,如果条件成立那么变1,条件不成立就是0.
SF(sign flag)
用来反应运算结果的最高位(二进制的),值跟最高位一样.
OF(overflow flag)
就是拿来判断运算结果是不是溢出,如果是溢出了那么得到的结果是1,没溢出就是0.
正+正=负了,那么OF变1
负+负=正了,那么OF变1
跟CF的区别
主要就是有无符号的运算,如果是无符号运算只需要关注C标志位,如果是有符号的运算关注O位标志位
DF(direction flag)
如果D是1那么操作的两个寄存器就要相应的去减数据宽度对应的大小.0+,1-
在ELF里面就是各个标志寄存器的汇总,需要转成2进制就是各寄存器了


关于汇编
https://boke-git-main-huang-chaos-projects.vercel.app/2025/10/26/关于汇编/
作者
Ined
发布于
2025年10月26日
许可协议