《现代x86汇编语言程序设计》怎么写里边的代码
本来作者说的很清楚,附录里有怎么部署vs的环境,用vs写c/c++程序调用asm程序,但是我这本的翻译版没有附录,然而其他网站上都是有偿下载pdf文件orz,目前资源也不多,
没钱就只能自己想办法。。。
这里主要是用到了https://blog.csdn.net/dfq12345/article/details/69870513这位兄弟的方法。
当然首先是msam官网http://www.masm32.com/下masm并安装部署改一改环境变量,它安装好了以后会有一个默认编辑器,其实也能用。
还有masm for windows 共享版 这个软件也能用,而且感觉对新手挺不错的,还有教学,不过对于这本书,基本上都是c程序加上asm程序的方式,没看到什么纯汇编,所以就不用它了。。。
基本就是按照上面那个兄弟的方法,但是最后我按它的方法无法默认给我把 自动asm文件编译成obj文件然后再自动添加进去,改了设置也没用,要是有懂得可以教教我orz,
就每次只能用cmd 手动 ml /c /coff 文件名.asm 这样编译,目前就先这么用着吧,我的vs是官网下的2017,我在里边也没找到网上所说的那个调试-》窗口-》的寄存器选项,还有网上说的
扩展里的asm语法高亮的插件,从那个插件官网上找了插件,发现vs2017不允许安装?没办法只能这样。
http://blog.csdn.net/maguanzhan7939/article/details/78608345这是可行方案2,按照这个哥们说的做也成功了。但是这个貌似是用汇编做主函数,调用c函数库来显示。
所以就老老实实的用手动编译了。听说vs最好不要乱动,我也不敢随便更新和重装orz,所以目前就先这样吧。
ps:感觉整编译器这件事真是比较玄学,仿佛看到了汇编这条路上在这第一步上劝退了一堆人,有人随便就能配置好,还有人就疯狂受苦 (就像我orz)。
要是有问题可以私信,我们互相分享一下资源还有踩过的坑什么的,虽说不一定能帮上,但是可以分享学习经验,共同进步(抱团取暖)。。。。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
//写了几天以后,发现到36页的ConditonCodes_.asm 里边的那个cmovl大于条件赋值和cmovg小于条件赋值 被dosbox,masm for windows ,和cmd直接调用ml /c /coff
全都识别不出来,说cpu不识别的指令集,我电脑64位的,具体原因我也不清楚。但是这些编译器都是开头要加.386才能使用的那种,我自己瞎捣鼓找到了另一种办法竟然可行。。。。。。。
就是用https://www.kanxue.com/book-28-220.htm就用看雪学院里君子谬老师第一节课配置ide的方法在vs2017里新建个工程,然后只像它一样把依赖项选了,其他都不用选,我们只用这个工程的环境来编译,把你要编译的.asm文件加进去,然后直接编译执行,会告诉你编译成功但是没法连接,直接区debug文件里把编译出来的.obj
文件复制出来到你的那个用.cpp做主函数的原来的照着书上写的那个工程里,然后再打开那个工程,添加进去,编译执行,就可以了。
对了用这种方法要书上的代码一样不要在第一行加.386!!!
对了用这种方法要书上的代码一样不要在第一行加.386!!!
#include<tchar.h> #include<stdio.h> extern "C" int SignedMinA_(int a, int b, int c); extern "C" int SignedMaxA_(int a, int b, int c); extern "C" int SignedMinB_(int a, int b, int c); extern "C" int SignedMaxB_(int a, int b, int c); int _tmain(int agrc, _TCHAR*agrv[]) { int a, b, c; int smin_a, smax_a; int smin_b, smax_b; //signedmin 示例 a = 2; b = 15; c = 8; smin_a = SignedMinA_(a, b, c); smin_b = SignedMinB_(a, b, c); printf("SignedMinA(%4d,%4d,%4d)=%4d\n", a, b, c, smin_a); printf("SignedMinB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smin_b); a = -3; b = -22; c = 28; smin_a = SignedMinA_(a, b, c); smin_b = SignedMinB_(a, b, c); printf("SignedMinA(%4d,%4d,%4d)=%4d\n", a, b, c, smin_a); printf("SignedMinB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smin_b); a = 17; b = 37; c = -11; smin_a = SignedMinA_(a, b, c); smin_b = SignedMinB_(a, b, c); printf("SignedMinA(%4d,%4d,%4d)=%4d\n", a, b, c, smin_a); printf("SignedMinB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smin_b); //SignedMax示例 a = 10; b = -5; c = 3; smax_a = SignedMaxA_(a, b, c); smax_b = SignedMaxB_(a, b, c); printf("SignedMaxA(%4d,%4d,%4d)=%4d\n", a, b, c, smax_a); printf("SignedMaxB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smax_b); a = -3; b = 28; c = 15; smax_a = SignedMaxA_(a, b, c); smax_b = SignedMaxB_(a, b, c); printf("SignedMaxA(%4d,%4d,%4d)=%4d\n", a, b, c, smax_a); printf("SignedMaxB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smax_b); a = -25; b = -37; c = -17; smax_a = SignedMaxA_(a, b, c); smax_b = SignedMaxB_(a, b, c); printf("SignedMaxA(%4d,%4d,%4d)=%4d\n", a, b, c, smax_a); printf("SignedMaxB(%4d,%4d,%4d)=%4d\n\n", a, b, c, smax_b); }
.model flat,c .code SignedMinA_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] ;确定min(a,b) cmp eax,ecx jle @F mov eax,ecx ;确定min(a,b,c) @@: mov ecx,[ebp+16] cmp eax,ecx jle @F mov eax,ecx @@: pop ebp ret SignedMinA_ endp SignedMaxA_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] cmp eax,ecx jge @F mov eax,ecx @@: mov ecx,[ebp+16] cmp eax,ecx jge @F mov eax,ecx @@: pop ebp ret SignedMaxA_ endp SignedMinB_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] ;使用cmovg指令确定最小值 cmp eax,ecx CMOVG eax,ecx mov ecx,[ebp+16] cmp eax,ecx cmovg eax,ecx pop ebp ret SignedMinB_ endp SignedMaxB_ proc push ebp mov ebp,esp mov eax,[ebp+8] mov ecx,[ebp+12] cmp eax,ecx cmovl eax,ecx mov ecx,[ebp+16] cmp eax,ecx cmovl eax,ecx pop ebp ret SignedMaxB_ endp end
这几天看了逆向工程的一些课和资料,看雪学院有一些课,都挺好的https://www.kanxue.com/book-28-220.htm还有b站 极客方舟的视频资料,crack好有意思
这些天也算是收集了一些工具,想要的话可以加qq915405958联系,免费给你发过去。