寄存器(32位):
通用寄存器(8个):EAX、EBX、ECX、EDX、ESI、EDI、EBP、ESP
其中 ECX 为计数寄存器
其中 ESP 为栈顶指针寄存器
其中 EBP 栈底指针寄存器
其中 ESI、EDI用于movs (把A复制到B)
ESI 存放所复制数据的堆栈地址 A的地址
EDI 存放所复制数据的目的堆栈地址 B的地址
CPU下一次执行地址寄存器 EIP
堆栈:是程序所申请使用的内存空间,指令中要使用堆栈中的数据需要用特定的格式调用
汇编指令:
mov 复制数据(把立即数存到通用寄存器或堆栈、通用寄存器中的值存到其他通用寄存器中、通用寄存器中的值存到堆栈中、把堆栈中的值存到通用寄存器中)
movs 把堆栈中某一地址的数据复制其他的堆栈地址中(执行以后 ESI、EDI中的地址会加所复制的字节数(如复制两个字节就加2))
stos 把AL/AX/EAX的值存到EDI指定的内存(堆栈)单元中,EDI中的地址值会加或减相应的字节数(如movs)
REP + 指令 重复执行某条指令,按照计数寄存器ECX中指定的次数重复执行字符串指令,每执行一次ECX中的值就减一
PUSH 向堆栈中压入数据,并修改栈顶指针ESP寄存器
POP +寄存器 把栈顶指针的数据拿出放到某个寄存器,然后栈顶指针减4(32位)(16位的减2)
jmp + 立即数/通用寄存器/堆栈地址 修改EIP寄存器的值
call 格式同上 修改EIP中的值,并将call指令下一行的地址压入堆栈中
RETU 将栈顶中的数据放到EIP寄存器中,并将栈顶指针寄存器加4(32位)
ADD 加指令
SUB 减指令
位运算(计算机只会进行位运算,四则运算都是位运算组合而成):
and 与指令(二进制对应的位数的值都为1时 才为1)
物理实现:
or 或指令(二进制对应的位数的值有一个为1时,就是1)
物理实现:
xor 异或运算 (二进制中对应位数的值不一样时,结果为1)
物理实现:
not 非运算 (0就是1,1就是0)
shl 左移 C语言中(<<)各二进制全部左移若干位,高位丢弃,低位补0
shr 右移 C语言中(>>) 各二进制全部右移若干位,低位丢弃,高位补0
sar 右移 C语言中(>>) 各二进制全部右移若干位,低位丢弃,高位补符号位
标志寄存器(运算影响此寄存器):
CF位 如果算数操作产生的结果在最高位发生进位或借位,则将置1,反之清零。通常用来指示无符号整数运算的溢出状态
OF位 用于反映有符号数加减运算所得结果是否溢出
PF位 奇偶校验位 最低有效字节(数的最后一个字节)包含偶数个1 则该位置1,否则清零。通常用于奇偶校验
AF位 如果算数操作在结果的第三位发生进位或者借位则将该标志置1,否则清零。 通常在BCD算数运算中被使用
ZF位 结果为零将置1 反之清零 ,经常与CMP TEST等指令一起使用
SF位 该标志被设置成有符号整型的最高有效位,通常用于判断结果是正还是负
DF位 方向标示位 控制字符串指令(影响MOVS,CMPS,SCAS,LODS,STOS)设置DF标志为1使串指令自动递减(高地址向低地址处理字符串)清除该标志使串指令自动递增
使用STD、CLD指令分别用于设置为1以及清除DF位为0