win32汇编基础学习一

来源:互联网 发布:js与ajax 编辑:程序博客网 时间:2024/05/21 10:32

问题1

win32程序运行在模式模式下,什么是保护模式?

Windows把每一个Win32应用程序放到分开的虚拟地址空间中去运行,每个应用程序都拥有相互独立的4GB地址空间,这里不是说它们拥有4GB的物理空间,而只是说能够在4GB的范围内寻址。怎么做到每个应用程序都相互独立的运行在各自的4GB虚拟地址空间,这里需要操作系统完成虚拟地址和物理地址的转换,而且保护各个应用程序所应用的物理空间不被其他应用程序访问。这就是windows保护模式的作用。

问题2

win32和win16下的分段,如把代码分成data,code等段内存模式有什么不同?

16位Widows下把代码分成DATA,CODE等段,因为每段寻址空间为64k=2pow(16),所以各段必须小于等于要64k的大小。

32位Windows下只有一种内存模式,即FLAT,意思是“平坦”的内存模式,没有了64k的段大小限制,所有得win32的应用程序运行在一个连续,平坦,巨大的4GB空间,这意味着您无需和段寄存器打交道,比如在DOS时运行.CODE段必须把该段的段地址装入CS段寄存器,对于有得段寄存器为操作系统为我们自动装入。您可以用任意的段寄存器寻址任意的地址空间,这对程序员来说非常方便。

问题3

 

.386
.MODEL Flat, STDCALL
.DATA
    <Your initialized data>
    ......
.DATA?
   <Your uninitialized data>
   ......
.CONST
   <Your constants>
   ......
.CODE
   <label>
    <Your code>
   .....
    end <label>

.386什么意思

这是一个汇编语言伪指令,它告诉编译器,程序使用80386指令集编写。您可用.486,.586,但最安全的还是使用.386。对于每一种CPU有两套几乎功能相同伪指令:.386/.386P、 486/.486P、 586/.586P。 带P的指令标明您的程序中可以用特权级指令。特权级指令是保留给操作系统的,如虚拟设备驱动程序。在大多数时间,您的程序都无须运行在RING0层,故用不带后缀P的伪指令已足够了。

问题4

.model flat,stdcall中.model flat是什么意思

.MODEL 是用来指定内存模式的伪指令,在Win32下,只有一种内存模型,那就是FLAT。

问题5

stdcall是什么意思,它与C和Pascal调用约定的异同

STDCALL 告诉编译器参数的传递约定。参数的传递约定是指参数传达时的顺序(从左到右或从右到左)和由谁恢复堆栈指针(调用者或被调用者)。在Win16下有两种约定:C 和 PASCAL。C 约定规定参数传递顺序是从右到左,即最右边的参数最先压栈,由调用者恢复堆栈指针。

例如:为调用函数 foo ( int first_param, int second_param, int third_param ); 按C约定的汇编代码应该是这样的:

push [third_param]
push [second_param]
push [first_param]
call foo
add esp, 3 * 4 ;调用者自己恢复堆栈指针

PASCAL约定和C约定正好相反,它规定参数是从左向右传递,由被调用者恢复堆栈。Win16采用了PASCAL约定, 因为PASCAL约定产生的代码量要小。当不知道参数的个数时,C约定特别有用。如在函数wsprintf () 中, wsprintf预先并不知道要传递几个参数,所以它不知道如何恢复堆栈。

STDCALL是C约定和PASCAL约定的混合体,它规定参数的传递是从右到左,恢复堆栈的工作交由被调用者。Win32只用STDCALL约定,但除了一个特例,即:wsprintf。

问题6

win32的分段的概念

上面的四个伪指令是"分段"(SECTION)伪指令。我们上面刚讲过Win32下没有"段"(SEGMENT)的概念,但是您可以把您的程序分成不同的"分段", 一个"分段"的开始即是上一个"分段"的结束。

问题7

data段又可分为几个段,分别是什么

WIN32中只有两种性质的"分段":DATA和CODE。
其中DATA"分段"又分为三种:
.DATA 其中包括已初始化的数据。
.DATA? 其中包括未初始化的数据。比如有时您仅想预先分配一些内存但并不想指定初始值。使用未初始化的数据的优点是它不占据可执行文件的大小,如:若您要在 .DATA? 段中分配10,000字节的空间,您的可执行文件的大小无须增加10,000字节,而仅仅是要告诉编译器在装载可执行文件时分配所需字节。
.CONST 其中包括常量定义。这些常量在程序运行过程中是不能更改的。 应用程序并不需要以上所有的三个"分段", 可以根据需要进行定义。

.code段在win32中的意义

实际上,分段并不是象在 Dos 下一样,为不同的段分别指出不同的段寄存器,因为 Windows 下只有一个 4GB 的段,Windows 程序中的分段表现在当程序装载时,赋予不同的分段不同的属性,比如说当你的程序加载时,对于 Ring3 程序来说,.code 段是不可写的,而 .data 段是可写的,如果你尝试象在 Dos 下一样写自己的代码部分,你会得到一个蓝屏错误

问题8

怎么确定code段范围

<label>
end <label>

是用来唯一标识您的代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。
原创粉丝点击