这次来分享的是用masm32编写一个很简单的汇编程序来入门一下masm32,打算使用斐波拉切数列这个简单的小程序来作为例子讲述。自己学习masm32原因是,编译原理告诉我们编译器通过一系列骚操作把我们的代码翻译成机器识别的机器码,这一波操作中有一步是翻译成了汇编代码,为了了解编译器的骚操作,我们当然得先懂得手工翻译,所以来回忆一下大一暑假学的汇编,讲道理masm32写起来还是很方便的。吐槽一下,感觉写masm32遇到的问题在度娘上很难找到很切合你所需要的答案,更多的要靠自己去翻官方的教程以及安装的masm32包里给你的一些demo来探索。
可能很多人开始学汇编用的是在dos虚拟机编写的,然而我们选用masm32就是为了借助MASM32包对很多动态链接库支持的特点,使用的时候可以对库函数直接调用,免去自己与硬件/操作系统底层打交道实现的麻烦。我第一次看到masm32给的示例那一堆include、while、invoke的反应是:这TMD什么鬼的汇编程序,你觉得我会信吗!后来看了教程才慢慢入门,可以说如果你对汇编语言和高级语言都有所了解的话,使用起来至少思路上还是很畅通的,至于说遇到问题很难在各大论坛找到针对性的答案,还希望有经验的大佬们分享一些好的方式或资源。
言归正传,fibonacci的高级语言的程序我想大家闭着眼睛倒叙着都能写出来,以C++的为例:
main()
{
int a, b, i, t, n;
a = 0;
b = 1;
i = 1;
cin >> n;
cout << a << endl;
cout << b << endl;
while (i < n)
{
t = b;
b = a + b;
cout << b << endl;
a = t;
i = i + 1;
}
}
它的masm32下的汇编代码是什么样的呢,我是这样写的(文章在会最后给出详细的注释版本):
.486
.model flat, stdcall
option casemap:none
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\masm32.lib
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
include \masm32\include\windows.inc
include \masm32\include\msvcrt.inc
include \masm32\include\masm32.inc
include \masm32\macros\macros.asm
.data
n dd 0
a dd 0
b dd 1
i dd 1
t dd 0
.code
start:
mov eax, sval(input("Enter a number : "))
mov n,eax
print chr$("Fibonacci_number")
print str$(1)
print chr$(" is ")
print str$(b)
print chr$(" ",13,10)
mov ecx,n
mov i,ecx
dec i
.while i
mov eax,b
mov t,eax
mov eax,b
add eax,a
mov b,eax
print chr$("Fibonacci_number")
mov ecx,n