《现代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联系,免费给你发过去。

posted @ 2019-03-26 23:51  超融合  阅读(1263)  评论(2编辑  收藏  举报