当前位置:鱼C工作室 >Win32汇编 > 查看文章

使用MASM01 – Win32汇编语言009

使用MASM01

 

让编程改变世界

Change the world by program


 

使用MASM

 

经过上一讲的准备工作,相信大家已经搭建好了 Win32 汇编的工作环境,并已经知道编译、链接一个程序的过程和原理了。

现在,我们让例子回归到经典:

#include <stdio.h>
int main(void)
{
    Printf(“Hello, worldn”);
} // 事实上想想,这不正是初生的婴儿?!

 

Win32汇编源程序的结构

 

麻雀虽小,五脏俱全。刚刚那个C语言的”Hello, world”程序包含了C语言中的最基本的格式。

在C语言的源程序中,我们不需要为堆栈段、数据段和代码段的定义而烦恼,编译器会自己解决。

 

回顾一下,在DOS 下的汇编这段代码会变成什么样?

在例子中我们看到,stack、data、code都找到了自己的小窝。

回归主题,在Win32 汇编语言下,小麻雀”Hello World” 又会变成什么样子呢?

是不是又不同了?但是,我们怎么就发觉Win32 汇编其实是前边两种形态的集大成者?!

接下来,小甲鱼带大家逐段来理解和接受这个新先的语言!

 

模式定义

 

程序的第一部分是模式和源程序格式的定义语句

.386
.model flat,stdcall
option casemap:none

 

这些指令定义了程序使用的指令集、工作模式和格式。

 

1)指定使用的指令集

.386语句是汇编语句的伪指令,类似的指令还有:.8086、.186、.286、.386/.386p、.486/.486p和.586/.586p等,用于告诉编译器在本程序中使用的指令集。

在DOS的汇编中默认使用的是8086指令集,那时候如果在源程序中写入80386所特有的指令或使用32位的寄存器就会报错。

Win32环境工作在80386及以上的处理器中,所以这一句.386是必不可少的。

 

另外,后面带p的伪指令则表示程序中可以使用特权指令,如:mov cr0,eax

这一类指令必须在特权级0上运行,如果只指定.386,那么使用普通的指令是可以的,编译时到这一句就会报错。

 

如果我们要写的程序是VxD等驱动程序,中间要用到特权指令,那么必须定义.386p,在应用程序级别的Win32编程中,程序都是运行在优先级3上,不会用到特权指令,只需定义.386就够了。

80486和Pentium处理器指令是80386处理器指令的超集,同样道理,如果程序中要用80486处理器或Pentium处理器的指令,则必须定义.486或.586。

 

另外,Intel公司的80×86系列处理器从Pentium MMX开始增加了MMX指令集,为了使用MMX指令,除了定义.586之外,还要加上一句.mmx伪指令:

 

分页阅读: 1 2 下一页
为您推荐

报歉!评论已关闭.