《現代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聯系,免費給你發過去。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM