Pages

顯示具有 Assembly Language 標籤的文章。 顯示所有文章
顯示具有 Assembly Language 標籤的文章。 顯示所有文章

2011年4月29日 星期五

[x86 Processor 組合語言] PTR, offset and Stack

今天剛弄懂的一點語法,記錄下來。

以下記錄關於PTR的用法:
1.   ptr指向的位置,裡面的值可以拿出來用。例如:
      mov   ax,BYTE   ptr   Uncle
      ;可以將Uncle這個變數從offset開始取出Byte長度的值,丟給ax。
      ;Offset指向的位置,是從較低位開始。

      於是我推測,如果寫:
      push   dword   ptr   3     ;代表將3這個數字從低位數開始,
                                            ;取dword長度(也就是4個byte),推到堆疊。
                                            ;所以就是把3推到堆疊。

       如果寫:
       push   dword   ptr   offset   Uncle
       ; 代表將Uncle這個變數的位址取出,取dword長度,推到堆疊。

2.   offset跟ptr不同在於,ptr拿的是值,offset直接將某個變數的位址取出。

Stack:
1.   每次push,會減少ESP的值(每次減少4的byte數要看operand的資料大小)。所以ESP指向的記憶體位址,會隨著push越多資料而越來越小的。

2.   pushad跟popad適合分別寫在某程序的開頭跟結尾,如果此程序有更改到如EAX、ECX、EDX、EBX、ESP等等32bit的暫存器。

2011年4月21日 星期四

[x86 Processors 組語] 常用指令

(1)建立陣列:
   arr1   SWORD   10   DUP(0)   ;代表建立一個名為arr1的陣列,
                                                     ;大小為10,陣列元素型態為SWORD,
                                                    ;陣列中每個元素初始化為0
(2)   .code   ;代表code segment的開始。
(3)   main PROC   ;PROC是一個指令,main是procedure名。
       ………
        main ENDP   ;代表 main procedure的結束。
(4)   END   main   ;指出程式進入點是main,
                             ;指出最後一行被組譯的程式。
(5)   mov   esi,OFFSET   abc   ;esi存著abc的記憶體位址開頭。
(6)   call readint會從鍵盤讀進32bit signed整數,並存到eax,而call writingstring的話則會將edx指向的字串輸出到console。

[x86 Processors組語] 移除MASM32

安裝MASM32後,如果想要移除MASM32,直接在安裝MASM32的磁碟下將"masm32"資料夾移除即可,如此即為完全移除,並不會有任何登錄檔設定沒有完全移除的問題。(MASM32是file based)

2011年3月12日 星期六

[組語] 在Visual Studio 2010 設定組語撰寫環境

1. 在安裝MASM 32之前,防毒系統一定要先關閉,如此可以保證完整安裝,因為有些防毒系統會將MASM當成木馬,造成安裝失敗。

安裝MASM的畫面:


2. 安裝Irvine,預設解壓縮路徑可以設為C:\Irvine

3. 安裝完MASM跟Irvine之後,接下來就是Visual Studio 2010內一些組態設定:

(1)新增一個空專案。
(2)先點選方案總管下剛剛新增的專案,並點選專案->組建自訂。將masm勾選。
(3)在方案總管下專案的原始程式檔那邊,新增一個C++程式碼。並將副檔名設為.asm。
(4)在專案總管下點選專案名稱,點選專案->屬性,選擇左側VC++目錄,在右邊的include目錄新增MASM 32的nclude目錄。並且在程式庫目錄新增MASM 32的lib目錄。例如安裝在C:\masm32,則新增Include目錄C:\masm32\include;$(IncludePath),以及新增程式庫目錄C:\masm32\lib;$(LibraryPath)。

Irvine是提供連結的函式庫。

(5)先點選方案總管的專案名稱右鍵開啟屬性,將組態屬性->連結器->系統裡,右邊的子系統設定為主控台(方便組語程式輸出結果在console視窗)。將連結器->一般內,右邊的其他程式庫目錄新增剛才解壓Irvine的路徑(如此連結器就知道要去哪裡找程式庫了)。
連結器->輸入內,其他相依性增加Irvine32.lib。並且在Microsoft Macro Assembler->General內,右邊Include Path新增剛才解壓Irvine的路徑。並在Microsoft Macro Assembler->Object File內,右邊的Object File Name路徑複製後貼到Microsoft Macro Assembler->Listing File內右邊Assembled Code Listing File,將副檔名改為lst。

設定完成後,就可以開始寫組語程式了。建置後點選啟動但不偵錯即可執行。

有關Macro這個字,我查了一下,是"指令組"的意思。