了解简单程序通过指令实现的过程

首先对汇编进行初步了解

几个简单汇编指令

mov----------->传送字或字节

movsx----------->先符号扩展,在传送

movzx----------->先0扩展,再传送

push ----------->入栈

pop----------->出栈

lea----------->装入有效地址

pusha----------->把ax,cx,dx,bx,sp,bp,si,di依次压入堆栈

popa----------->把di,si,bp,sp,bx,dx,cx,ax依次弹出堆栈

pushad----------->把eax,ecx,edx,ebx,esp,ebp,esi,edi依次压入堆栈

add----------->两数相加(不带进位)

xadd----------->先交换在累加

**sub----------->减法指令 **

bswap----------->交换32位寄存器里面字节的顺序

xchg----------->交换字或字节(至少有一个操作数为寄存器,段寄存器不可作为操作数)

cmpxchg----------->比较并交换操作数(第二个操作数必须为累加器al/ax/eax)

call----------->调用子程序,子程序结束已ret结束

les ----------->传送目标指针,把指针内容装入ES

未完(不待)续。。。

通用寄存器

eax----------->是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。
ebx----------->是"基地址"(base)寄存器, 在内存寻址时存放基地址
ecx----------->是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
edx----------->则总是被用来放整数除法产生的余数。
esi/edi ----------->分别叫做"源/目标索引寄存器"(source/destination index),因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串
ebp----------->是"基址指针"(BASE POINTER),常用作栈底指针
esp----------->专门用作堆栈指针,被形象地称为栈顶指针

.

#源代码

#include<stdio.h>

int sum(int a,int b)
{
	return a+b;
} 

int main()
{
	int x=10;
	int y=20;
	int z=sum(x,y);
	return z;
}

实现过程

(此处栈从上到下,地址由低到高)

00991760  push        ebp  					(栈底指针入栈)

00991761  mov         ebp,esp  				(让栈底指针指向之前的栈顶指针)

00991763  sub         esp,0E4h  			(栈顶指针上移0e4h)

00991769  push        ebx  					(存放基地址)

00991783  call        main 					(调用main函数)

00991788  mov         dword ptr [x],0Ah  	(将10赋值给x)

0099178F  mov         dword ptr [y],14h  	(将20赋值给y)

00991796  mov         eax,dword ptr [y]  	(将y的值传给eax)

00991799  push        eax  					(eax入栈)

0099179A  mov         ecx,dword ptr [x]  	(将x的值传给ecx)

0099179D  push        ecx  					(ecx入栈)

0099179E  call        sum (099107Dh)   		(调用sum函数,记录下一条指令)


009917A3  add         esp,8  				(esp下移8)

009917A6  mov         dword ptr [z],eax  	(将sum的返回值传给z)

009917A9  mov         eax,dword ptr [z]  	(将z的值传给eax)

009917AE  pop         ebx  					(ebx地址出栈)

009917AF  add         esp,0E4h  			(esp下移0e4h,返回栈底)

009917BC  mov         esp,ebp  				(栈顶指针指向栈底)

009917BE  pop         ebp  					(栈底指针出栈)

009917BF  ret  								(结束调用)

sum调用过程

009916F0  push        ebp  					(栈底指针入栈)

009916F1  mov         ebp,esp  				(让栈底指针指向之前的栈顶指针)

009916F3  sub         esp,0C0h  			(栈顶指针上移0c0h)

009916F9  push        ebx  					(记录栈基地址)

00991718  mov         eax,dword ptr [a]  	(将a的值存入a)

0099171B  add         eax,dword ptr [b]  	(将b加a的值传入eax)

00991720  pop         ebx  				(ebx出栈)

00991721  add         esp,0C0h  		(esp下移0c0h,返回栈底)

0099172E  mov         esp,ebp  			(栈底指针指向栈顶)

00991730  pop         ebp  				(栈底指针出栈)

00991731  ret  							(结束调用sum)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值