WIN32汇编第二遍(1)

原创 2005年03月02日 21:04:00
背景知识
一.80x86处理器的三种工作模式:实模式,保护模式,虚拟86模式。
1.三种模式的关系
2.三种模式的各自特点(寻址空间,内存使用,寄存器的使用,优先级,中断保护,特权指令等)
二.Windows的内存管理
1.Win32汇编中每一个程序都可以使用4G的内存么?
2.Win32汇编代码中为什么看不到CS,DS,ES和SS等段寄存器呢?
3.DOS下的著名的“640KB限制”是什么?
三.80386的内存分页机制
1.在保护模式下,段选择器+偏移地址被称作线形地址,那么线形地址就是物理地址么?
2.虚拟内存的实现。
3.Windows操作系统为用户程序的代码段,数据段和堆栈段都已经设置好了正确的描述符,用户因此不必关心段寄存器。
四.Windows的特权保护
1.80386的异常和中断处理。
为什么在win32编程中没有int指令?其实调用API就是中断处理了。
2.80386的保护机制
A.段的类型检查。可读可写可执行方面
B.页的类型检查。可读可写方面
C.访问数据时的级别检查。访问优先级
D.控制转移的检查。优先级问题
E.指令集的检查。特权指令和敏感指令
F.I/O操作的保护。







编程环境
一. 刀和枪
代码编写工具:MASM32软件包和ASM FOR EDITPLUS
资源编辑器:VC的资源编辑器
二. Ml.exe,Link.exe和nmake的用法
三. 设置环境变量的批处理文件
@echo  off
Set include=x:/masm32/Include
Set lib=x:/masm32/lib
Set path=x:/masm32/bin;%path%
Echo on







了解WIN32汇编程序结构
一. 模式定义:
.386 //指令集
.model flat,stacall //模式
option casemap:none //格式
二. 段的定义:在WIN32汇编中有以下几个段供使用
数据段
.data 已定义的数据变量
.data? 未定义的数据变量(可以视情况分配空间,节约程序大小)
.const 常量
代码段
.code
三. 程序的结束和入口地址
说来惭愧,还记得张驴儿在我开始学习WIN32汇编的时候曾经问我:“在Windows汇编程序设计中也有main()函数么?”我不以为然的回答:“是啊”。现在想想真是寒啊。自己不懂就多学习嘛还楞是装~!
其实在WIN32汇编中不存在C语言中的main()函数,在C中编译器是默认的把main()函数当作程序的入口地址并执行。但是在汇编中这种情况没有了,你需要自己指定入口地址,这是由程序中最后一句:end start来完成的。End后面的标识符就是程序的入口地址!
四. 注释和换行
一个作风严格的程序员是要有好的习惯的。
汇编源程序中的注释是以“;”开始的。
当一行还显示不下源程序的代码时,用“/”表示换行。

附:一个简单的HELLO WORLD!程序
.386
.model flat
Option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Include windows.inc
Include user32.inc
Includelib user32.lib
Include kernel32.inc
Includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szCaption db ‘A MessageBox!’,0
szText db ‘HELLO WORLD!’,0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
Start:
Invoke  MessageBox,NULL,offset szText,offset szCaption,MB_OK
Invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
End start

五. 调用API
使用invoke。Invoke伪指令不是386的处理指令,而是MASM编译器的伪指令。API函数有的有返回值,返回值类型对于汇编程序来说只有一种:dword,它永远放在eax中。
与字符串相关的API函数有两种:一类是处理ANSI字符集的,一类是处理UNICODE字符集的。





标号、变量和数据结构
一. 标号:当程序中要跳转到另一个位置的时候,需要有一个标识来指示新的位置,这就是标号。通过在目的地址前面放一个标号,可以在指令中使用标号来代替直接使用地址。@@的使用
二. 全局变量和局部变量:全局变量放在.data和.data?中。局部变量的使用有利于大工程中的程序模块封装。局部变量放在堆栈中。MASM中用local伪指令提供对局部变量的支持。RtlZeroMemory这个API函数对局部变量实行初始化。
三. 数据结构:assume伪指令把寄存器预先定义为结构指针。
Mov esi,offset stWndClass
Assume esitr WNDCLASS
Mov eax,[esi].lpfnWndProc

Assume esi:nothing
四.获取变量的地址。全局变量:offset伪指令;局部变量:lea,注:在invoke中使用局部变量的地址要用addr!而且addr指令只能用在invoke中。而且不能在addr前使

Win32汇编语言学习笔记>>第二课:编写第一个Win32汇编程序

本节课主要是编译连接一段写好的代码: 程序运行如下: 代码: .386 .model flat,stdcall option casemap:none include C:\mas...
  • eldn__
  • eldn__
  • 2013年01月01日 12:33
  • 1295

win32 汇编基础

一、关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会。 EA...
  • nicholas199109
  • nicholas199109
  • 2013年01月31日 22:58
  • 1652

WIN32汇编对话框的使用

刚开始接触windows下的对话框,第一感觉就像是一个一般的窗口一样,没有图标,只有一个框框,中间有一些提示的控件(按钮,输入的文本框等)信息,在学习使用对话框的时候,资源文件的编写我感觉比编写实现对...
  • qq_22642239
  • qq_22642239
  • 2016年03月25日 20:09
  • 747

win32汇编 钩子的编写与使用

说到钩子也许我们都很陌生(我以前从来没有接触过这个东西)
  • qq_22642239
  • qq_22642239
  • 2016年06月02日 17:36
  • 2294

win32汇编动态链接库的编写及使用

以前安装程序的时候,在安装目录下总会发现 好多的以.DLL结尾的文件,这些是什么玩意儿?有什么用?而且有时候运行程序的时候还会出现“无法定位程序输入点...与动态链接库....上”这种错误,现在想起来...
  • qq_22642239
  • qq_22642239
  • 2016年05月30日 21:53
  • 4367

WIN32汇编语言中位图的使用

说到位图,我们其实很早就接触过,从最早接触计算机,我们应该就知道有图片这个东西,然后再进一步说,图片在电脑上有好几种格式比如jpg. gif .png....
  • qq_22642239
  • qq_22642239
  • 2016年04月18日 11:12
  • 2903

使用WIN32汇编语言实现一个基本windows窗口的过程分析

一个常规的windows窗口一般都是一些一样的构造,你如果想要更改一些个性化的设置,你可以在这个一般的模板伤添砖加瓦,构造自己比较喜欢的类型,下边就分析一下一般的windows窗口的一般模板。 一...
  • qq_22642239
  • qq_22642239
  • 2016年03月07日 20:55
  • 2283

Win32汇编--使用资源—版本信息资源

转载于:http://www.cppblog.com/luqingfei/archive/2010/09/21/127239.html 有时应用程序需要确保自己运行时使用某一特定版本的DLL,以...
  • xiaotoly
  • xiaotoly
  • 2016年12月23日 15:59
  • 266

Win32汇编之使用资源--菜单和加速键

///我们在使用软件时可以看到菜单、图标、版本信息等,它们是可执行文件的组成     部分也是Windows中的不同类型的资源。这些资源并不在源码的数据段中定义,     而是单独放在一个节区中,需...
  • u012869992
  • u012869992
  • 2014年08月10日 19:45
  • 565

win32汇编实现一个时钟

windows下的图像操作,涉及到图形的操作,我们就会想到GDI(图形设备接口),其实也就是一个大型的函数库,可以实现WINDOWS环境下的画线,画图,字体处理等操作。就如同这次分析的一个简单的时钟,...
  • qq_22642239
  • qq_22642239
  • 2016年04月12日 16:47
  • 2575
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WIN32汇编第二遍(1)
举报原因:
原因补充:

(最多只允许输入30个字)