Win32汇编基础1

1.关于寄存器
Windows 在内部频繁使用 ESI,EDI,EBP,EBX 寄存器,而且并不去检测这些寄存器的值是否被更改,所以如果要使用这些寄存器时必须先保存它们的值,待用完后再恢复它们

eax 是WIN32 API 默认的返回值存放处。
ecx 是LOOP指令自动减一的寄存器,也就是一半用来计数,比如使用rep指令时,也是比较CX的值。
esp 是堆栈指针,指向栈顶。
ebp 经常用来在堆栈中寻址。
esi 好像常常用在指针寻址中。

edi 是目的地址寄存器。

2.关于堆栈

Windows为每个程序安排了堆栈段,它是从高地址向低地址延伸的,之所以采用这种方式,是因为这样可以使堆栈指针始终指向最近入栈的元素的起始地址,这样的话,为访问这个元素提供了非常便利的方式。

ESP作为堆栈指针始终指向栈顶,如果看一下PUSH和POP的操作就可以明白这句话:
PUSH: ESP <-- ESP-4 (ESP+3,ESP) <-- 入栈元素
POP: 出栈元素 <-- (ESP+3,ESP) ESP <-- ESP+4

因为PUSH和POP自动修改了ESP的值,使它始终指向栈顶了。当然也可以自己来修改ESP的值,例如我们可以:

sub  esp,4  ;这样就把栈顶指针向下移动了。
这种操作常常用在局部变量的分配中,在子程序中使用到局部变量时,就在堆栈中为它们提供空间,这样可以使子程序退出时收回局部变量占用的空间,有利于子程序的模块化。

我们可以用ESP来寻址堆栈中的元素,比如ESP指向当前栈顶元素的起始地址,ESP-4指向前一个元素的起始地址,不过因为ESP常常在变化,这样用ESP在堆栈中寻址的话不方便,所以我们就用EBP来代替ESP寻址,首先把EBP入栈保存,然后把ESP赋值给EBP,这样就可以用EBP来寻址堆栈中的数据了。我用一个例子来说明堆栈的变化。

push  0x00000001           ;1
push  ebp                  ;2
mov  ebp,esp               ;3
push  0x12345678           ;4
mov  eax,dword ptr[ebp+4]  ;5
mov  ebx,dword ptr[ebp-4]  ;6
mov  ax,word ptr[ebp-2]    ;7
mov  al,byte ptr[ebp-1]    ;8
mov  al,byte ptr[ebp-3]    ;9
mov  ax,word ptr[ebp-3]    ;10

5 eax=0x00000001
6 ebx=0x12345678
7 ax=0x1234
8 al=0x12
9 al=0x56
10 ax=0x3456

堆栈使用在子程序的实现中,当调用子程序时,首先把参数入栈,然后把返回IP入栈,然后转移到子程序处,如果有局部变量,则下移ESP,然后初始化该局部变量,这样用到EBP来寻址局部变量,参数的寻址同样要用到EBP。

Win32汇编基础1

时间: 2024-10-09 18:11:15

Win32汇编基础1的相关文章

【win32汇编】0x01 开篇一些乱七八糟的话

之前弄完了16位汇编,现在正式学习win32汇编,首先就是一些原理了,其实就是在16位的基础上增加了一些内容,其程序主要的结构记录如下 (1)指令集    .386     这是指定指令集 必须工作在80386的处理器上    mov cr0,eax    这类指令在特权级0上运行,编译到这个就报错    如果要写VxD等驱动程序,中间要用到特权指令.必须定义.386p    但是在正常情况只要.386就可以了,这个是运行在特权级3上面的    Pentium MMX中增加了mmx指令     

win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)

Windows网络编程,相信好多人都知道,但是我们一般都是用其他语言编写,例如C,C++,JAVA,python等等,这些语言都可以,但是汇编语言比较底层,利用它,我们可以更清晰的了解到网络编程的内在部分,这是其他语言不能相比的,好了,废话不多说,这其实就是这次的目的(毕竟水平欠缺,还是先来按照罗云斌老师的WIN32汇编书上的例子加以学习,举一反三吧). 说道网络编程,现在我所接触到的程序开发,工具软件的使用,库等等都是基于Windows平台的,想要了解Windows的网络编程就必须要知道Win

加壳学习笔记(二)-汇编基础

7.简单的汇编语法:   堆栈平衡  PUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数 POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPAADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,

二鸟学Win32 汇编——PE头文件

;代码段    .code;---------------------; 将内存偏移量RVA转换为文件偏移; lp_FileHead为文件头的起始地址; _dwRVA为给定的RVA地址;---------------------_RVAToOffset proc _lpFileHead, _dwRVA local @ret pushad mov esi, _lpFileHead assume esi:ptr IMAGE_DOS_HEADER add esi, [esi].e_lfanew ass

win32汇编实现阶乘和斐波那契数列

win32阶乘程序 .486 ;使用486处理器.model flat,stdcall include \masm32\include\msvcrt.inc includelib \masm32\lib\msvcrt.lib .data result0 dd 1;存储最终结果 inputdata dd ?;输入的阶乘的最大值 type0 db '%d',0 data4 db '请输入阶乘最大值ddddd: ',0 data1 db '请输入阶乘最大值: ',0 data2 db '阶乘结果为:

汇编基础:二进制和十六进制

理解二进制和十六进制的最佳方法是先透彻的领悟十进制计数系统.十进制(Decimal)系统是基于10的计数系统(词根Deci-表示10)."基于10"指的是由10个数位(Digit)0到9来表示数. 使用"位置(Place Value)",可以用不多的几个数位(如10个十进制数位)来表示很大的数.所有计数系统的位置从最右边开始,是基数的0次幂.从右往左,基数的幂依次增加1: X4X3X2X1X0 基数是10时,前5个位值是: 104103102101100 对任何基数

Win32汇编开始 Hello Asm

今天开始学习Win32汇编 因为自己很多都是Windows方面 所以 接触一下Win32汇编 .386 ;.386指令集 .model flat,stdcall ;工作模式 option casemap:none ;关键字大小写不敏感 include Windows.inc include kernel32.inc includelib kernel32.lib include user32.inc includelib user32.lib .data MessageBoxText db "H

汇编基础知识

1.SI和DI 功能和bx相似,只是不能分成2个8寄存器使用. 2INC ax指令 将寄存器的内容加1 mov ax,0 inc ax 执行完毕ax=1 3.bx,si,di,bp寄存器 CPU的核心是寄存器,学习汇编这么一段时间,我也深刻体会到对寄存器理解的重要性 (1)在8086CPU中,只有这4个寄存器可以在[...]中来进行内存单元的寻址.比如下面指令是正确的. mov ax,[bx] mov ax,[bx+si] mov ax,[bp] mov ax,[bp+si] mov ax,[b

ARM汇编基础(iOS逆向)

1. ARM汇编基础 在逆向一个功能的时候,往往需要分析大量的汇编代码,在iOS逆向中,ARM汇编是必须掌握的语言,本文总结了ARM汇编的基础知识,如果你想了解更多,请参考狗神的小黄书<iOS逆向逆向工程>或ARM官方手册. 1.1 寄存器,内存和栈 在ARM汇编里,操作对象是寄存器,内存和栈 ARM的栈遵循先进后出,是满递减的,向下增长,也就是开口向下,新的变量被存到栈底的位置;越靠近栈底,内存地址越小 一个名为stackPointer的寄存器保存栈的栈底地址,成为栈地址. 可以把一个变量给