那些令我迷惑的汇编语法(自用)
CS 代码段寄存器
DS 数据段寄存器
ES 附加段寄存器
FS 同上
GS 同上
SS 栈段
约定
AX 累加寄存器(算数、逻辑运算、保存外设I/0 数据)
BX 基址寄存器(存地址,作为基址)
CX 计数寄存器(循环)
DX 数据寄存器(存数据,端口号)
SI 源变址寄存器(数据源地址,指向被传送数据“在那”)
DI 目的变址寄存器(和SI一样,数据“到哪”)
SP 栈指针(段基址SS)
BP 基址寄存器(段基址SS,SS:BP 把栈当普通数据段访问,push、pop 不影响bp)
inter语法 从右向左读 源、目标
AT&T 从左向右读 源、目标
在汇编代码中声明一个段
sction code vstart = 0x7c00
其中vstart 只影响$$,$,标号
section.code.start 依旧为真实偏移
2^20 = 1MB
2^16 = 64KB
mov ax,[FS:0x5678] 指定段FS,默认为DS
指令 enter : 进入函数调用时使用,为下面两条指令操作
push ebp
mov ebp,esp
指令leave:退出函数调用时使用
mov esp,ebp
pop ebp

在C语言调用函数时,参数从右向左入栈。(正常1-6个参数用寄存器,大于部分用栈此处为展示)
压入返回地址
压入ebp
mov ebp,sp (此时栈顶sp指向ebp)
push 压入d为函数内局部变量
ret 弹出栈顶2个字节到IP ,SP+=2
retf 弹出4个字节,2个字节到IP,2个字节到CS ,SP+=4
ret 近调用,远调用
常用eflags寄存器
CF 进位,最高位有进位或借位,溢出为1,检测无符号数加减是否溢出
PF 通过低位1的奇偶数的个数,判断数据传送中是否出线错误
ZF 零标志位,计算结果为0,标志位1
SF 符号寄存器,计算为负,SF=1
IF 开关中断的标志位
OF 有符号溢出检测
mul 无符号指令相乘
格式:mul 寄存器/内存
其中操作数为乘数
乘数为8位,被乘数为al ,结果便是16位,存入ax
乘数为16位,被乘数为ax ,结果为32位,存入eax
乘数为32位,被乘数eax,结果64位,存入edx:eax,edx为高32位。
同理有符号乘法imul
实模式下默认操作数为16位,压入8位立即数会扩展。
保护模式下默认操作数是32位
push 压入8位会立即数会被扩展为32位
压入16位 不扩展
浙公网安备 33010602011771号