C语言嵌套汇编代码混编

#include <stdio.h> int main() { int a; int b; int c; __asm { mov a, 12h //3的值放在a对应内存的位置 mov b, 12 //4的值放在a对应内存的位置 mov eax, a //把a内存的值放在eax寄存器 add eax, b //eax和b相加,结果放在eax mov c, eax //eax的值放在c中 } printf(“%d\n”, … “C语言嵌套汇编代码混编”

Read More

汇编-Win32 Example

搞了一个星期,哥才发现原来汇编是代码是不可通用的,真是坑啊,弃坑弃坑. Code Example .386 ; 指明32位指令集 .model flat, stdcall ; flat为Windows程序使用的模式,stdcall为API调用时右边的参数先入栈 .stack 4096 ; 堆栈为4096字节 COMMENT & 这是一段注释. 定义了一个ExitProcess函数,它是标准的Windows服务.PROTO是原型关键字, 并定义了一个DWORD类型的输入参数,函数返回0认为我们执行成功. & ExitProcess PROTO, dwExitCode: DWORD .data sum DWORD 0 ; 定义变量 .code main PROC ; … “汇编-Win32 Example”

Read More

汇编-Visual Studio 2010

网上都是DOSASM环境或者MASM32环境下运行汇编,突然发现微软神器Visual Studio也能拿来用,简直厉害,下边哥简单记录下运行过程. 安装Visual Studio 2010. 新建VC++下的空项目. 右击新建的解决方案管理器中,选中生成自定义–masm. 新建项,将文件名后缀改为.asm. 右击项目属性,在链接器-系统-子系统中,选中/SUBSYSTEM:CONSOLE. 在链接器-高级-入口点中,填入程序入口点,通常都会填main,这个看自己喜好. 填入代码调试运行即可.

Read More

汇编-指令的基本操作

80×86指令系统,指令按功能可分为以下7种: 数据传送指令. 算术运算指令. 逻辑运算指令. 串操作指令. 控制转移指令. 处理器控制指令. 保护方式指令. 数据传送指令 数据传送指令包括:通用数据传送指令、地址传送指令、标志传送指令、符号扩展指令、扩展传送指令等. 通用数据传送指令 MOV: 传送1个字节,字或双字. PUSH: 把数据压入堆栈. PUSHA: 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈. PUSHAD: 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈. POP: 把数据弹出堆栈. POPA: 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈. POPAD: 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈. BSWAP: 交换32位寄存器里字节的顺序. XCHG: 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG: 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX) XADD: 先交换再累加.(结果在第一个操作数里) XLAT: 字节查表转换.如BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL) … “汇编-指令的基本操作”

Read More

汇编-寄存器

一个典型的CPU通常由运算器/控制器/寄存器等器件组成,这些器件由内部总线相连接,外部总线则实现CPU与主板上其他器件的联系. 其中寄存器是可以由程序员用与指令读写的部件,即程序员通过改变各个寄存器的内容来实现对CPU的控制. 不同类型的CPU,它们的寄存器个数,结构可能是不同的,例如8086CPU有着14个寄存器,分别是:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DE,ES,PSW. 数据寄存器 32位CPU有4个32位的数据寄存器EAX,EBX,ECX,EDX.并且完全兼容16位CPU的AX,BX,CX,DX数据寄存器. 在16位CPU中,AX、BX、CX和DX不能作为基址和变址寄存器来存放存储单元的地址,但在32位CPU中,其32位寄存器EAX,EBX,ECX,EDX不仅可传送数据,暂存数据保存算术逻辑运算结果,而且也可作为指针寄存器,所以,这些32位寄存器更具有通用性。 16位CPU中有4组是数据寄存器,也简称通用寄存器,分别是AX,BX,CX,DX;而在32位CPU上则有8组数据寄存器;到了64位CPU,则扩展到了16组数据寄存器. 16位CPU的所有寄存器都是16位,分为高8位和低8位.所以一个寄存器可以存放两个字节,连个字节组成一个字,即: – AX分高AH和低AL; – BX分高BH和低BL; – CX分高CH和低CL; – DX分高DH和低DL; 变址寄存器 32位CPU有2个32位变址寄存器ESI,EDI,完全兼容16位CPU中的SI,DI.对低16位数据的存取,不影响高16位的数据. 变址寄存器主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便. 变址寄存器不可分割成8位寄存器.作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果.它们可作一般的存储器指针使用.在字符串操作指令的执行过程中, 对它们有特定的要求,而且还具有特殊的功能. 指针寄存器 32位CPU有2个32位通用寄存器EBP,ESP,完全兼容16位CPU中的BP,SP.对低16位数据的存取,不影响高16位的数据. 指针寄存器主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便. 指针寄存器不可分割成8位寄存器.作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果. 它们主要用于访问堆栈内的存储单元,并且规定: – BP 为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据; – SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶. 指令指针寄存器 32位CPU的指令指针为EIP,它的低16位与先前CPU中的IP作用相同. … “汇编-寄存器”

Read More

汇编-基础

开始学习汇编了. 0 概念 关于计算机编程语言,可粗略的分为低级语言和高级语言.那么什么是低级语言.大多情况下,低级语言就是指机器语言(机器码)和汇编语言. 最低级的语言自然是机器语言,也就是机器码,它是由0和1组成,而且CPU能识别的也就只有0和1组成的高低位电平脉冲,它具有极高的效率.因此无论用什么语言去写,最终都会被翻译成0和1,只是其中转换的复杂度与效率的高低问题. 早期的程序员将0和1的程序代码打在纸带或卡片上,1打孔,0不打孔,然后通过纸带机输入到计算机进行运算,但机器码是反人类的,用这种语言写程序,简直就是在浪费生命,因此他们发现了这问题.于是更稍稍便利的语言便出现了,那就是汇编语言. 汇编是除了机器码外,效率最高的语言了,它直接对CPU进行操作. 1 组成 汇编语言由三种指令组成: – 汇编指令: 机器码的助记符,有分别对应的机器码. – 伪指令: 没有对应的机器码,由编译器执行,计算机不会执行. – 其他符号: 如+,-,*,/等,由编译器识别,无对应机器码. 汇编语言的主题是汇编指令,因此其核心便是汇编指令,它决定了汇编语言的特性. 2 存储 存储器是用于指令和数据的存放的地方,在一个计算系统的任何部位都有存储器,包括CPU,主板,显卡,声卡.存储器也可以指内存或磁盘,但是CPU若想读取磁盘上的指令和数据,要先将其从磁盘读到内存,最后加载到CPU内部. 指令和数据在内存或磁盘上是没有任何区别的,他们都是二进制的信息.它们的意义和区别只在CPU在工作时,才会体现出来. 存储器按类型可分为只读存储器(ROM)和随机存储器(RAM). 一个存储器可被分为若干个存储单元,每个单元从0开始顺序编号.计算系统的最小信息单位是bit(比特),即一个二进制位. 8bit组成1Byte,即1Byte能保存8个二进制位.通常计算机存储还会用以下容量计算单位: 1KB=1024Byte 1MB=1024KB 1GB=1024MB 1TB=1024GB 1PB=1024TB 1EB=1024PB 1ZB=1024EB 1YB=1024ZB … “汇编-基础”

Read More