x86汇编#
操作数排列是从源(右)到目的(左)
1
2
3
4
5
6
7
8
9
10
|
assume cs:codesg ;假设代码段的名称为codesg
codesg segment ;定义一个codesg段
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends ;codesg段结束
end ;是个伪指令,程序的结束标记
|
AT&T汇编#
1.寄存器
引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp
8个16-bit寄存器 它们事实上是上面8个32-bit寄存器的低16位:
%ax,%bx,%cx,%dx,%di,%si,%bp,%sp
8个8-bit寄存器 %ah,%al,%bh,%bl,%ch,%cl,%dh,%dl
它们事实上是寄存器%ax,%bx,%cx,%dx的高8位和低8位
6个段寄存器 %cs(code),%ds(data),%ss(stack), %es,%fs,%gs
3个控制寄存器 %cr0,%cr2,%cr3;
6个debug寄存器 %db0,%db1,%db2,%db3,%db6,%db7;
2个测试寄存器 %tr6,%tr7;
8个浮点寄存器栈 %st(0),%st(1),%st(2),%st(3),%st(4),%st(5),%st(6),%st(7)
|
2.操作数顺序
操作数排列是从源(左)到目的(右)
1
|
movl %eax(源), %ebx(目的) (ebx) = (eax)
|
要动手实践的事情:
1.标出来的实验
2.字母大小写转换 看DOSBox中的内存状况
3.低八位、高八位 DOSBox中的内存状况以及栈中的状况
寄存器及其作用#
寄存器以e开头或r开头,来代表不同的架构,其中e开头表示32位,r开头表示64位
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
堆栈是一种简单的数据结构,是一种只允许在其一端进行插入或删除的线性表。
允许插入或删除操作的一端称为栈顶,另一端称为栈底,对堆栈的插入和删除操作被称入栈和出栈。
有一组CPU指令可以实现对进程的内存实现堆栈访问。其中,POP指令实现出栈操作,PUSH指令实现入栈操作。
CPU的ESP寄存器存放当前线程的栈顶指针,EBP寄存器中保存当前线程的栈底指针。
CPU的EIP寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
ECX一般用来当作计数器
EDX是数据寄存器
EAX是累加器
EBX是基址寄存器,
ESI是源变址寄存器
EDI是目的变址寄存器
ESP是堆栈指针寄存器
EBP是基址指针寄存器,其中ESP和EBP一般是针对堆栈面言
|
CS:IP
存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行
CS Code segment
IP instruction Pointer
PC
PC是非intel厂家对IP的称呼,也就是说PC起始跟CS:IP是一回事儿。
PC 是计算机科学中使用的一个术语。IP 是 x86 兼容 CPU 中的一个寄存器。
简单来说,在 x86 兼容 CPU 上,CS 段寄存器和 IP 寄存器两个寄存器就是实现计算机科学中的 PC 这个概念的具体设施。
AX
BX
CX
DX
DS
SS
SP
SI
DI
ESP(Extended Stack Pointer)为扩展栈指针寄存器,是指针寄存器的一种,用于存放函数栈顶指针。与之对应的是EBP(Extended Base Pointer),扩展基址指针寄存器,也被称为帧指针寄存器,用于存放函数栈底指针。