汇编入门1:变量定义,四则运算

汇编程序的编写与高级语言的不同,就在于有很多寄存器级别的运算,代码中al、bl其实是2个寄存器,就相当于一个定义好的全局变量,而且在进行某些操作之后,寄存器会被清空,这是编写程序的时候需要注意的。为了方便演示,我们直接将结果简化为对应ascii码的数字,方便显示。初始运算变量dst中30h代表16进制,也就是16*3=48,第一个加法程序中我们计算dst + 7,也就是48+7=55,意味着ascii码中对应的数字7。最终输出结果为7证明了我们的计算是对的。去掉了繁琐的数字转换,回归最淳朴的汇编计算,可以更深入地理解本质。

代码为:

.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 

输出结果为

7
3
2
8
Hello World!
12345678

猜你喜欢

转载自my.oschina.net/u/2996334/blog/1822868