zoukankan      html  css  js  c++  java
  • 《现代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
    ", a, b, c, smin_a);
        printf("SignedMinB(%4d,%4d,%4d)=%4d
    
    ", 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
    ", a, b, c, smin_a);
        printf("SignedMinB(%4d,%4d,%4d)=%4d
    
    ", 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
    ", a, b, c, smin_a);
        printf("SignedMinB(%4d,%4d,%4d)=%4d
    
    ", 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
    ", a, b, c, smax_a);
        printf("SignedMaxB(%4d,%4d,%4d)=%4d
    
    ", 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
    ", a, b, c, smax_a);
        printf("SignedMaxB(%4d,%4d,%4d)=%4d
    
    ", 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
    ", a, b, c, smax_a);
        printf("SignedMaxB(%4d,%4d,%4d)=%4d
    
    ", 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联系,免费给你发过去。

  • 相关阅读:
    std::auto_ptr
    make_pair
    _stdcall与_cdecl(了解)
    函数名与函数指针(了解)
    空指针与野指针
    std::bind(二)
    C++ map 映照容器
    sql find duplicate
    数量
    sort sign numeric
  • 原文地址:https://www.cnblogs.com/worldcreator-zh/p/10604784.html
Copyright © 2011-2022 走看看