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>
是用来唯一标识您的代码范围的标签, 两个标签必须相同,应用程序的所有可执行代码必修在两个标签之间。
- win32汇编基础学习一
- WIN32汇编学习笔记(一)
- Win32汇编学习笔记之基础篇
- Win32汇编学习笔记(一)
- Win32汇编学习笔记(一)
- WIN32汇编学习笔记(一) 汇编环境搭建
- WIN32汇编基础
- WIN32汇编基础
- WIN32汇编基础
- WIN32汇编基础
- WIN32汇编基础
- WIN32汇编基础
- Win32汇编基础
- WIN32汇编基础
- win32 汇编基础
- win32 汇编基础
- WIN32汇编基础
- Win32汇编基础
- 《c程序设计语言》 1.2变量及算术表达式
- 什么是java的path和classpath?
- Linux下TFTP SERVER配置
- sap学习资料
- !?Linux 安装oracle
- win32汇编基础学习一
- 嵌入式学习历程
- mj评《变形金刚3>>-8分
- java.lang.OutOfMemoryError: Java heap space
- 伪随机数(baike.baidu.com)字符串生成程序已修改,红体字程序为本人改写,编译正常
- [Oracle] 建库语句
- spring3.0包介绍
- onMeasure和onLayout
- flup、WSGI及Django