那些令我迷惑的汇编语法(自用)

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位 不扩展

 

 

    

 

posted on 2022-02-26 15:56  thotf  阅读(91)  评论(0)    收藏  举报

导航