edx

汇编程序设计与计算机体系结构软件工程师教程笔记:函数、字符串、浮点运算

别等时光非礼了梦想. 提交于 2020-10-06 00:51:10
《汇编程序设计与计算机体系结构: 软件工程师教程》这本书是由Brain R.Hall和Kevin J.Slonka著,由爱飞翔译。中文版是2019年出版的。个人感觉这本书真不错,书中介绍了三种汇编器GAS、NASM、MASM异同,全部示例代码都放在了GitHub上,包括x86和x86_64,并且给出了较多的网络参考资料链接。这里只摘记了NASM和MASM,测试代码仅支持Windows和Linux的x86_64。 6. 函数 6.2 栈内存入门: 栈内存 (stack memory) 是为自动变量而设的一块区域 (这里的自动变量是指局部变量,或者说非动态的变量)。调用函数的时候,需要用栈来保存函数中的局部变量,而函数结束的时候,则需要弃用这些变量。高级语言的一项特征在于它会自行管理栈内存(这有时也叫做运行时栈或运行期栈),相反,汇编语言不会这样做,而是需要你自己去管理。 与栈内存有关的重要事项: (1).栈会在调用函数时增长,并在调用结束时收缩。 (2).栈会在创建(或者说推入/压入)局部变量时增长,并在弃用(或者说弹出)局部变量时收缩。 (3).每个进程或线程的栈,其大小受操作系统限制,例如Linux/Mac系统默认是8MB,Windows默认是1MB。 (4).每次调用函数(这也包括调用主函数main(),以及递归地调用自身)都会出现对应的栈帧(stack frame)

【C/C++】__stdcall、__cdcel和__fastcall定义与区别

╄→尐↘猪︶ㄣ 提交于 2020-10-04 03:16:10
1、定义 __stdcall __stdcall是Pascal方式清理C方式压栈,通常用于Win32 Api中,函数采用从右到左的压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上”@”和参数的字节数。 int f(void *p) –>> _f@4(在外部汇编语言里可以用这个名字引用这个函数). __cdecl __cdecl (The C default calling convention)即C调用约定按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。 __fastcall __fastcall调用的主要特点就是快,因为它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),在函数名修饰约定方面,它和前两者均不同。__fastcall方式的函数采用寄存器传递参数,VC将函数编译后会在函数名前面加上”@”前缀,在函数名后加上”@”和参数的字节数。 2、区别 1、调用协议常用场合 __stdcall

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

China☆狼群 提交于 2020-08-20 09:19:40
首先介绍一些乐观锁与悲观锁:   悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如 Java里面的同步原语 synchronized关键字的实现也是悲观锁 。   乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间别人有没有去更新这个数据 ,可以使用版本号等机制。 乐观锁适用于多读的应用类型 ,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在 Java中java.util.concurrent.atomic包下面的 原子变量类就是使用了乐观锁的一种实现方式CAS实现的 。 乐观锁的一种实现方式-CAS(Compare and Swap 比较并交换):   锁存在的问题:      Java在JDK1.5之前都是靠 synchronized关键字保证同步的 ,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有共享变量的锁,都采用独占的方式来访问这些变量。这就是一种独占锁,独占锁其实就是一种悲观锁,所以可以说 synchronized 是悲观锁。  

选择了计算机专业的同学,我们大学四年应该如何安排,才是正确的?

 ̄綄美尐妖づ 提交于 2020-08-20 06:36:36
四年的努力决定了你毕业时的高度,决定了你能进入什么样的公司,拿着什么样的薪资,过着什么样的生活。 多努力点,生活总不会亏待于你。 结合自己的经历,和大家分享下如何利用好大学四年,希望对大家有所帮助。 1. 兴趣是最好的老师 有两种力量会推动我们不断前行,一种是兴趣,一种是责任感。其实在前行的路上会发现这两种力量往往会互相支持着我们前行:因为兴趣我们开始了我们的学习、事业,遇到了困难,因为责任而坚持;遇到了瓶颈,忽发现这些正是自己的热爱所在,又坚持了下来,就像这样循环往复以至最后。 编程是一件很需要兴趣的事情,因为它需要不断的学习,不断的练习,这其中会包含许多不解的难题、无法fix的bug、难眠的夜晚,如果你不能发现其中的乐趣,很难坚持下去并且把它做好。 如果你是计算机专业的,并且喜欢编程,那么你很幸运可以快乐地畅游在代码的海洋中;如果你是计算机专业的,但是一点也不喜欢编程,而是已经有了其他的想法,那么你也很幸运,因为你有了奋斗一生的目标。如果你是计算机专业的,但是一点也不喜欢编程,但是不知道要做些什么,没关系尽管去尝试、去找寻,不要把时间浪费在一点也不喜欢的事情上。如果你不是计算机专业,但却喜欢编程,那么放手去编程吧,编程方面的知识通过自学完全可以,我的第一份工作所用到的知识,大部分不是源于课堂,而是来自于自我学习

对某游戏功能实现的逆向分析及实现变态功能

ε祈祈猫儿з 提交于 2020-08-19 18:31:08
不知道有没有人玩过QQ堂这款游戏,这是一个08年的竞技游戏,玩家通过放"泡泡"与其他玩家进行PK,童年时代特别喜欢玩,只可惜这款游戏后来毁于辅助泛滥。时至今日,win10系统已经不兼容QQ堂这款游戏了,所以我拿了火拼QQ堂这款游戏进行逆向分析,分析当年那些让人眼花缭乱的功能是如何实现的。 通常竞技类游戏的变态功能容易实现,原因就是竞技类游戏往往追求及时反馈以及对游戏的流畅性要求高,因此很多游戏功能的实现逻辑都是放在客户端执行的,通过修改内存或者封包都很容易实现变态功能。而角色扮演类,回合制等游戏则对这些没有太过严格的追求,因此游戏功能的实现逻辑大部分都是放在服务器上运行的,所以变态功能没有竞技类游戏那么好实现,而且要实现变态功能一般都是用封包去找服务器的漏洞。 之前发过一篇"火拼QQ堂穿墙功能的挖掘",实现穿墙,有些数据下面的分析会用到,传送门:https://mp.weixin.qq.com/s/DdEpDFn3sen7Jb3rU-K3iA 这次把火拼QQ堂的人物放泡泡整个的执行流程大体分析一遍,主要是学习了一段时间后,想试试通过反汇编把游戏中某个功能的整个实现流程大体读懂,其中有分析不明白的地方,以后分析出来了会作补充。其中有分析有错误的地方,也请各路大神多多指正。 游戏中有一个内存地址记录了当前泡泡道具的数量,先用CE把这个内存地址找到,当我们在游戏里放个泡泡

mingw32 exception在sjlj与dwarf差别-反汇编分析

天大地大妈咪最大 提交于 2020-08-17 06:52:05
sjlj (setjump/longjump)与dwarf-2为mingw32两种异常处理模型的实现。sjlj有着开销,而随linux发行的mingw32开发库包都是用sjlj版编译的,而Qt却采用dwarf-2版,那么两者之间有多少差异,本文就这问题对两版的异常代码的反汇编进行分析比较。 我使用mingw-w65-i686-810的sjlj与dwarf-2两个版本对下面异常代码编译。 __attribute__((dllimport)) int dllfunc(); int main() { dllfunc(); // _create_locale(LC_ALL, "C"); printf( " abc " ); // return 0; try { try { throw std::exception(); } catch (std::exception& )   { std::rethrow_exception(std::current_exception());   } } catch ( int ) { } catch (std::exception& e) { std::cout << e.what() << std::endl; } catch (...) { std::cout << " unknown " << std::endl; } return 0 ; }

保姆级EduSoho开源版安装教程:FTP工具使用指导(附视频转码实操)

冷暖自知 提交于 2020-08-16 14:12:16
l 如何使用 FileZilla的SFTP模式来上传您的文件 1:下载FileZilla 按照您现在操作系统的状态来选择下载对应的客户端。 下载地址: https://filezilla-project.org/download.php?show_all=1 2: 设置连接新站点 打开 [文件] -> [站点管理器],出现一下界面,并按照要求填写。 A:主机按照您的IP来填写。 B: 协议选择SFTP。 C: 登录类型选择[正常]。 D: 用户名和密码按照您的需要来填写。 E: 如果端口有修改,那么请填写对应的端口 3: 如果出现请求客户端信任的对话框,请点击[总是信任],并点击[确认]。 4: 如果网络不出现问题的话,您将成功连接到你要的服务器上。 l 另附:保姆级视频转码指导 以下将介绍如何转换出合格的流式 MP4文件,供开源网络教学软件EduSoho实现流式播放 。本文涉及到的软件是格式工厂,具体下载地址: http://www.pcfreetime.com/CN/index.html 开源网络教学软件 EduSoho EduSoho支持的MP4视频编码格式AVC(H264) , 音频编码格式:AAC。 采用格式工厂转换 1、下载安装格式工厂 2、准备好需要转换的视频 3、点击转换目标mp4按钮 4、弹出对话框点击需要转换的文件,可以一次性选择多个 5、选择视频文件 6

常见C++面试题(三)

谁都会走 提交于 2020-08-16 03:43:02
strcpy和memcpy有什么区别?strcpy是如何设计的,memcpy呢? strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。(保证dest可以容纳src。) memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。 strcpy的原型是:char* strcpy(char* dest, const char* src); char * strcpy( char * dest, const char * src) // 实现src到dest的复制 {    if ((src == NULL) || (dest == NULL)) // 判断参数src和dest的有效性   {        return NULL;   }    char *strdest = dest; // 保存目标字符串的首地址    while ((*strDest++ = *strSrc++)!= ' \0 ' ); // 把src字符串的内容复制到dest下    return strdest; } memcpy的原型是:void *memcpy( void *dest, const void *src, size_t count ); void *memcpy( void *memTo,

MariaDB 在创建外键的时候提示 1005 错误

笑着哭i 提交于 2020-08-15 11:27:56
在 MariaDB 中的表创建外键的时候提示错误: SQL Error (1005): Can't create table `edx`.`TestBankAnswer` (errno: 150 "Foreign key constraint is incorrectly formed") 导致这样原因是因为你的表中没有创建 PK (主键)。 你需要在你的表上面创建主键后再创建外键就可以了。 https://www.ossez.com/t/mariadb-1005/225 来源: oschina 链接: https://my.oschina.net/honeymoose/blog/4339495

第七章家庭作业——符号解析,重定位绝对引用,重定位相对引用

陌路散爱 提交于 2020-08-12 07:31:55
题一:符号解析 考察可重定位目标文件各个节的内容,本质分类,那就分类: 节 内容 .text 已编译程序的机器代码, 函数 .data 已初始化的全局 C 变量,包括已初始化的extend,带static 属性的本地变量,不带static的全局变量 .bss 未初始化的全局 C 变量,包括未初始化的不带static的全局变量,带static 属性的本地变量 注意带有static属性的变量或函数都被认为是 本地 变量或函数Local symtab . m 定义并能被其他模块引用的全局符号:全局函数和变量 ...... 由其他模块定义并被模块 m 引用的全局符号:extend........ 只被模块 m 定义和引用的本地符号,包括带static属性的本地变量或函数.......... 分析过程如下: ① buf由关键字extend引入,是外部变量,swap.o.symtab条目中会存放由其他模块定义并被模块 m 引用的全局符号,这个外部是指的main.o,查看CSAPP前面的main.c代码可以发现buf是已经被初始化的全局变量,因此保存在节.data中 ② bufp0是定义在全局的已初始化变量,因此会被swap.o.symtab条目存放;它在swap.o中定义,存放于.data节 ③ bufp1是带static属性的静态未初始化全局变量,因此会被swap.o.symtab条目存放