通用寄存器-内存读写

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1119278087/article/details/60660050

文章目录


常见汇编指令
格式:mov 目的操作数,源操作数
作用:拷贝源操作数到目标操作数

  1. 源操作数可以是立即数,通用寄存器,段寄存器,或者内存单元
  2. 目标操作数可以是通用寄存器,段寄存器或者内存单元
  3. 操作数的宽度必须一样
  4. 源操作数和目标操作数不能同时位内存单元
  • SUB 相减指令
  • ADD 相加指令
  • AND 相与指令
  • OR 或指令
  • XOR 异或指令
  • NOT 非指令
  • LEA 取地址

mov word ptr DS:[0x12345678],0xFFFF

word:数据宽度
ptr:表示这是内存
[]:[]内的是内存编号

db 内存地址 data byte
dd 内存地址 data dword
dw 内存地址 data word

寻址公式:

寻址公式一:[立即数]
寻址公式二:[reg]
寻址公式三:[reg+立即数]
寻址公式四:[reg+reg*(1 2 4 8)]
寻址公式五:[reg+reg*(1 2 4 8)+立即数]

位移(Displacement) - 8 位、16 位或 32 位值
基(Base) - 通用目的寄存器
索引(Index) - 除 ESP 外的通用目的寄存器
比例因子(Scale Factor) - 1,2,4 或 8

下列五种地址模式为常用组合(图 2-3):
·位移
·基
·基 + 位移
·(索引×比例因子)+ 位移
·基 + (索引×比例因子)+ 位移

为什么只有五种表示方法,而且比例因子还有限制?
极有可能的原因是(猜测):计算机只识别机器语言,所以我们要将内存地址的表示方
法翻译成机器语言才能得到执行。组合越多,翻译起来越麻烦,cpu 的技术员们只好订个规
矩:只能使用五种表示方法,否则一律不识别。

堆栈

  • PUSH:压栈

    lea esp,[esp-4] // 上移指针sp
    mov [esp],eax // 向sp指向的位置填入eax
    这两条指令的组合就是指令:push eax

push r32
push r16
push m32
push m16
push imm8/imm16/imm32

  • POP:出栈

    mov eax,[esp] //把sp处的内容填入eax
    lea esp,[esp+4] //把sp指针下移
    就是指令 pop eax。

pop r32
pop r16
pop m32
pop m16

  • PUSHAD

保存现场:把八位寄存器全部压栈
pushad={
tmp=esp
push eax
push ecx
push edx
push ebx
push tmp
push ebp
push esi
push edi
}

  • POPAD

恢复现场:还原八位寄存器的值

需要了解具体的(pusha pushad;popa popad),请看:https://blog.csdn.net/longintchar/article/details/50866801

猜你喜欢

转载自blog.csdn.net/qq1119278087/article/details/60660050