汇编程序的编写与高级语言的不一样,就在于有不少寄存器级别的运算,代码中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