汇编语言整数加减法示例
在《第一個匯編語言程序》一節中給出的 AddTwo 程序,并添加必要的聲明使其成為完全能運行的程序。
?
; AddTwo.asm -兩個 32 位整數相加 .386 .model flat,stdcall .stack 4096 ExitProcess PROTO, dwExitCode:DWORD .code main PROC mov eax,5 ;將數字5送入eax寄存器 add eax,6 ;eax寄存器加6 INVOKE ExitProcess,0 main ENDP END main第 3 行是 .386 偽指令,它表示這是一個 32 位程序,能訪問 32 位寄存器和地址。第 4 行選擇了程序的內存模式(flat),并確定了子程序的調用規范(稱為 stdcall)。其原因是 32 位 Windows 服務要求使用 stdcall 規范。第 5 行為運行時堆棧保留了 4096 字節的存儲空間,每個程序都必須有。
第 6 行聲明了 ExitProcess 函數的原型,它是一個標準的 Windows 服務。原型包含了函數名、PROTO 關鍵字、一個逗號,以及一個輸入參數列表。ExitProcess 的輸入參數名稱為 dwExitCode。
可以將其看作為給 Windows 操作系統的返回值,返回值為零,則表示程序執行成功;而任何其他的整數值都表示了一個錯誤代碼。因此,程序員可以將自己的匯編程序看作是被操作系統調用的子程序或過程。當程序準備結束時,它就調用 ExitProcess,并向操作系統返回一個整數以表示該程序運行良好。
大家可能會好奇,為什么操作系統想要知道程序是否成功完成。理由如下:與按序執行一些程序相比,系統管理員常常會創建腳本文件。在腳本文件中的每一個點上,系統管理員都需要知道剛執行的程序是否失敗,這樣就可以在必要時退出該腳本。
腳本通常如下例所示,其中,ErrorLevel1 表示前一步的過程返回碼大于或等于 1 :
call program_1 if ErrorLevel 1 goto FailedLabel call program_2 if ErrorLevel 1 goto FailedLabel :SuccessLabel. Echo Great, everything worked!現在回到 AddTwo 程序清單。第 15 行用 end 偽指令來標記匯編的最后一行,同時它也標識了程序的入口(main)。標號 main 在第 9 行進行了聲明,它標記了程序開始執行的地址。
匯編偽指令回顧
現在回顧一些在示例程序中使用過的最重要的匯編偽指令。
首先是 .MODEL 偽指令,它告訴匯編程序用的是哪一種存儲模式:
.model flat,stdcall32 位程序總是使用平面(flat)存儲模式,它與處理器的保護模式相關聯。關鍵字 stdcall 在調用程序時告訴匯編器,怎樣管理運行時堆棧。然后是 .STACK 偽指令,它告訴匯編器應該為程序運行時堆棧保留多少內存字節:
.stack 4096數值 4096 可能比將要用的字節數多,但是對處理器的內存管理而言,它正好對應了一個內存頁的大小。所有的現代程序在調用子程序時都會用到堆棧。首先,用來保存傳遞的參數;其次,用來保存調用函數的代碼的地址。
函數調用結束后,CPU 利用這個地址返回到函數被調用的程序點。此外,運行時堆棧還可以保存局部變量,也就是,在函數內定義的變量。
.CODE 偽指令標記一個程序代碼區的起點,代碼區包含了可執行指令。通常,.CODE 的下一行聲明程序的入口,按照慣例,一般會是一個名為 main 的過程。程序的入口是指程序要執行的第一條指令的位置。用下面兩行來傳遞這個信息:
.code main PROCENDP 偽指令標記一個過程的結束。如果程序有名為 main 的過程,則 endp 就必須使用同樣的名稱:
main ENDP最后,END 偽指令標記一個程序的結束,并要引用程序入口:
END main如果在 END 偽指令后面還有更多代碼行,它們都會被匯編程序忽略。程序員可以在這里放各種內容一一程序注釋,代碼副本等等,都無關緊要。
運行和調試 AddTwo 程序
使用 Visual Studio 可以很方便地編輯、構建和運行匯編語言程序。下面的步驟,按照 Visual Studio 2012,說明了怎樣打開示例項目,并創建 AddTwo 程序:
1) 啟動計算機上安裝的最新版本的 Visual Studio。
2) 打開 Visual Studio 中 Solution Explorer 窗口。它應該已經是可見的,但是程序員也可以在 View 菜單中選擇 Solution Explorer 使其可見。
3) 在 Solution Explorer 窗口右鍵點擊項目名稱,在文本菜單中選擇 Add,再在彈出菜單中選擇 New Item。
4) 在 Add New File 對話窗口中(如下圖所示 ) ,將文件命名為 AddTwo.asm,填寫 Location 項為該文件選擇一個合適的磁盤文件夾。
5) 單擊 Add 按鈕保存文件。
6) 鍵入程序源代碼,如下所示。這里大寫關鍵字不是必需的:
; AddTwo.asm - adds two 32-bit integers. .386 .model flat,stdcall .stack 4096 ExitProcess PROTO,dwExitCode:DWORD .code main PROC mov eax, 5 add eax, 6 INVOKE ExitProcess,0 main ENDP END main7) 在 Project 菜單中選擇 Build Project,查看 Visual Studio 工作區底部的錯誤消息。這被稱為錯誤列表窗口。注意,當沒有錯誤時,窗口底部的狀態欄會顯示 Build succeeded。
調試演示
下面將展示 AddTwo 程序的一個示例調試會話。演示使用的是 Visual Studio 2012,不過,自 2008 年起的任何版本的 Visual Studio 都可以使用。
運行調試程序的一個方法是在 Debug 菜單中選擇 Step Over。按照 Visual Studio 的配置,F10 功能鍵或 Shift+F8 組合鍵將執行 Step Over 命令。
開始調試會話的另一種方法是在程序語句上設置斷點,方法是在代碼窗口左側灰色垂直條中直接單擊。斷點處由一個紅色大圓點標識出來。然后就可以從 Debug 菜單中選擇 Start Debugging 開始運行程序。
如果試圖在非執行代碼行設置斷點,那么在運行程序時,Visual Studio 會直接將斷點前移到下一條可執行代碼行。
當調試器被激活時,Visual Studio 窗口底部的狀態欄變為橙色。當調試器停止并返回編輯模式時,狀態欄變為藍色。可視提示是有用的,因為在調試器運行時,程序員無法對程序進行編輯或保存。
自定義調試接口
在調試時可以自定義調試接口。例如,如果想要顯示 CPU 寄存器,實現方法是,在 Debug 菜單中選擇 Windows,然后再選擇 Registerso, 其中 Registers 窗口可見,同時還關閉了一些不重要的窗口。EAX 數值顯示為 0000000B,是十進制數 11 的十六進制表示。
Registers 窗口中,EFL 寄存器包含了所有的狀態標志位(零標志、進位標志、溢出標志等)。如果在 Registers 窗口中 右鍵單擊,并在彈出菜單中選擇Flags,則窗口將顯示單個的標志位值。
Registers 窗口的一個重要特點是,在單步執行程序時,任何寄存器,只要當前指令修改了它的數值,就會變為紅色。盡管無法在打印頁面(它只有黑白兩色)上表示出來,這種紅色高亮確實顯示給程序員,使之了解其程序是怎樣影響寄存器的。?
在 Visual Studio 中運行一個匯編語言程序時,它是在控制臺窗口中啟動的。這個窗口與從 Windows 的 Start 菜單運行名為 cmd.exe 程序的窗口是相同的。或者,還可以打開項目 DebugBin 文件夾中的命令提示符,直接從命令行運行應用程序。如果采用的是這個方法,程序員就只能看見程序的輸出,其中包括了寫入控制臺窗口的文本。查找具有相同名稱的可執行文件作為 Visual Studio 項目。
下一篇:匯編器
強力推薦閱讀文章
年薪40+W的大數據開發【教程】,都在這兒!
總結
以上是生活随笔為你收集整理的汇编语言整数加减法示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php将图片导入,php中图片文件的导入
- 下一篇: Linux服务器安全之用户密钥认证登录(