汇编
小莫神和他的的
这个作者很懒,什么都没留下…
展开
-
C是怎么变成汇编
C是怎么变成汇编的这一段其实不是很多,就是加深了对c的理解而已裸函数__declspec(naked)怎么样对C变成汇编产生最直观的理解呢?那必须非裸函数莫属了。普通的函数通过反汇编会看到编译器自动生成的多行汇编代码。如果加上裸函数的声明,编译器就不会做任何添加。下面写一个裸函数来进行对比。普通函数int function(int x,int y,int z){ int a=4; int b=5; int c=6; return x+y+z+a+b+c;}用汇原创 2020-10-16 19:47:48 · 775 阅读 · 0 评论 -
STOS指令和LEA指令
STOS指令和LEA指令因为网上有些资料存在一些错误,所以写了这篇博客以供复习之用STOSSTOS指令有3种,分别对应的是3种数据形式DWORD,WORD,BYTESTOS DWORD PTR ES:[EDI] 'STOSD'STOS WORD PTR ES:[EDI] 'STOSW'STOS BYTE PTR ES:[EDI] 'STOSB'其实就是STOS+数据宽度首字母而已。而STOS其实等价于MOV [EDI],EAXADD [EDI],[4,2,1] or SUM [ED原创 2020-08-17 08:46:23 · 809 阅读 · 0 评论 -
编译器整数除法的优化
编译器整数除法的优化整数的除法有2种情况被除数是未知数那么编译器会使用div指令,运行效率会下降被除数/除数是常量那么情况会比较复杂,如果除数是2n2^n2n,就会使用shr a,n。其中a是被除数,n是2的幂。如果除数不是2呢?那么情况就会更加复杂了,不同的编译器会有不同的算法。通常的思路是将除法转换成乘法来提高运行的效率,最常见的优化算法便是倒数相乘了 ab=a∗(1b)\frac{a}{b}=a*(\frac{1}{b})ba=a∗(b1)原创 2020-08-16 08:15:05 · 1434 阅读 · 0 评论 -
指针遍历数据
指针遍历数据通过汇编的学习,越来越清楚地知道了无论什么东西在计算机其实就是二进制罢了,究竟代表什么,这取决你如何去看待它。用一道指针题来说明这个问题吧这一堆数据中存储了角色的血值信息,假设血值的类型为int类型,值为100(10进制)请列出所有可能的值以及该值对应的地址char arr[100] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x07,0x09,0x00,0x20,0x10,0x03,0x03,0x0C,0x00,0x00,0x44,0原创 2020-07-03 22:46:23 · 759 阅读 · 0 评论 -
汇编里的结构体
汇编里的结构体从汇编的角度来看,结构体是一种另类的数组。差别在于内存的分配上。数组结构体内存分配相同类型连续类型可能不相同int a[4]={0,1,2,3};String str="从汇编来看是这样的";__asm{ mov dword ptr [ebp-14h],0 mov dword ptr [ebp-10h],1 mov dword ptr [ebp-0Ch],2 mov dword ptr [ebp-8],3}原创 2020-06-29 19:39:16 · 2187 阅读 · 0 评论 -
汇编里的数组
汇编里的数组一维数组编译器为Visual Studio 2019一维数组在汇编里看到其实就是简化版的声明n个变量而已,学过java的可以理解为一个语法糖?int arr[5] = { 0,1,2,3,4 };__asm{ mov dword ptr [ebp-3Ch],0 mov dword ptr [ebp-38h],1 mov dword ptr [ebp-34h],2 mov dword ptr [ebp-30h],3 mov原创 2020-06-27 20:56:45 · 3842 阅读 · 0 评论 -
数据类型和存储
数据类型和存储浮点数据类型在C和C++中的浮点分为float和double。这2个浮点类型的区别在于宽度,在存储方式上没有区别。首先需要说明一点二进制是没办法表示负数的,所以负数的二进制表示有各种规范。C和C++采用的是IEEE标准,下面用一个float的例子来说明吧先将这个实数的绝对值化为二进制格式将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。从小数点右边第一位开始数出二十三位数字放入第22到第0位。如果实数是正的,则在第31位放入“0原创 2020-06-26 16:40:56 · 595 阅读 · 0 评论 -
《汇编语言》物理地址
物理地址段地址应该是一个逻辑概念,从《汇编语言》3.5数据段原文中比如用123B0H~123B9H 这段内存空间来存放数据,我们就可以认为123B0H~123B9H这段内存是一个数据段,它的段地址为123BH,长度为10个byte。从这里看出段地址指的应该是一个数据段的起始位置,在《汇编无言》2.7物理地址原文中 段地址∗16+偏移地址=物理地址段地址*16+偏移地址=物理地址段地址∗16+偏移地址=物理原创 2020-06-26 09:49:17 · 2368 阅读 · 0 评论 -
STOS指令和LEA指令
STOS指令和LEA指令因为网上有些资料存在一些错误,所以写了这篇博客以供复习之用STOSSTOS指令有3种,分别对应的是3种数据形式DWORD,WORD,BYTESTOS DWORD PTR ES:[EDI] 'STOSD'STOS WORD PTR ES:[EDI] 'STOSW'STOS BYTE PTR ES:[EDI] 'STOSB'其实就是STOS+数据宽度首字母而已。而STOS其实等价于MOV [EDI],EAXADD [EDI],[4,2,1] or SUM [ED原创 2020-06-17 18:11:48 · 1115 阅读 · 0 评论