彙編入門1:變量定義,四則運算

彙編程序的編寫與高級語言的不一樣,就在於有不少寄存器級別的運算,代碼中al、bl實際上是2個寄存器,就至關於一個定義好的全局變量,並且在進行某些操做以後,寄存器會被清空,這是編寫程序的時候須要注意的。爲了方便演示,咱們直接將結果簡化爲對應ascii碼的數字,方便顯示。初始運算變量dst中30h表明16進制,也就是16*3=48,第一個加法程序中咱們計算dst + 7,也就是48+7=55,意味着ascii碼中對應的數字7。最終輸出結果爲7證實了咱們的計算是對的。去掉了繁瑣的數字轉換,迴歸最淳樸的彙編計算,能夠更深刻地理解本質。python

代碼爲:編程

.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include masm32.inc
includelib kernel32.lib
includelib masm32.lib

.data
; ============= 數據定義部分 ======================
; 定義一個叫作HelloWorld的變量,變量類型是db?變量內存儲hello world字符串,並以結束符0結尾
HelloWorld db "Hello World!", 0 
; 定義一個叫作buffer的db類型
buffer     db 31h,32h,33h,34h,35h,36h,37h,38h,0
dst        db 30h
enter1     db 0ah,0 ; 定義一個換行符並以回車結尾
tmp        db 0

.code
; ============= 代碼部分 ==========================
main PROC
mov al, dst
ADD al, 7
mov tmp, al
invoke StdOut,addr tmp
invoke StdOut,addr enter1

mov al, dst
ADD al, 7
SUB al, 4
mov tmp, al ; tmp = al且清空al,此時再對al做任何運算都是無效的?
invoke StdOut,addr tmp
invoke StdOut,addr enter1
; ----------------------------------
; 25和2小於255,能夠作8位乘法,程序以下。
mov al,2    ; al = 2 (其中al爲低位寄存器,至關於臨時內存空間)
mov bl,25   ; bl = 25
mul bl      ; al = al * bl (al變化了,bl沒變)
mov tmp, al ; tmp = al ----> 要移出寄存器才能讀取乘完後獲得的結果
invoke StdOut,addr tmp
invoke StdOut,addr enter1

; ----------------------------------
mov al, 112 ; al = 112
mov bl, 2   ; bl = 2
div bl      ; al = al / bl ---> 112 / 2 = 56 -----> ascii裏的數字8
mov tmp, al ; tmp = al 且清空al -------> 要移出寄存器才能讀取乘完後獲得的結果
invoke StdOut,addr tmp
invoke StdOut,addr enter1

invoke StdOut, addr HelloWorld
invoke StdOut,addr enter1

invoke StdOut,addr buffer
invoke StdOut,addr enter1
invoke StdIn, addr buffer, sizeof buffer
invoke StdOut,addr buffer
invoke ExitProcess, 0 
main ENDP  
END main

輸出結果爲windows

7
3
2
8
Hello World!
12345678
相關文章
相關標籤/搜索