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汇编WIN32汇编WIN32汇编WIN32汇编

  • 2009年05月31日 11:27
  • 2.69MB
  • 下载

win32 汇编基础

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

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

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

搞了一下午 WIN32的汇编环境终于整好了

不容易啊,设置环境变量把偶弄得有点晕 不果还是设置好了偶使用MASM32 8.0中的LIB INCKUDE  BIN 这三个文件 采用NMAKE编译连接  编译器就是用EDITPLUS2 整好了 哈哈...
  • navyblue1982
  • navyblue1982
  • 2005-06-19 20:21:00
  • 2036

win32汇编入门了解(2)win32汇编基本结构

参考:http://book.51cto.com/art/200907/133040.htm (1)Summary win32汇编和8086或者单片机汇编,总体来说都是类似的,不同的汇编的...
  • gengshenghong
  • gengshenghong
  • 2011-11-28 21:22:16
  • 1440

谈Win32汇编

最近接触到Win32汇编,才知道汇编必须是和平台相关的,如做应用则和操作系统和CPU类型相关,而做操作系统就和只和的CPU类型有关。对于《微机原理》里面的汇编,那是DOS汇编,而Win32汇编是基于W...
  • u011514906
  • u011514906
  • 2014-09-03 16:23:57
  • 695

推荐一本Win32汇编的书

书名:《Windows环境下32位汇编语言程序设计》 作者:罗云彬简介:针对DOS下的汇编者升级之用;也可作为高校补充或扩展教材。:-)    DOS下的老汇编们大部分随着Win32的火爆而歇了菜,而...
  • Simbao
  • Simbao
  • 2006-06-30 13:57:00
  • 1755

win32汇编 罗云彬 第三版 高清

  • 2013年06月17日 21:22
  • 58.73MB
  • 下载

Win32汇编——过程控制(环境变量、命令行参数、可执行文件执行)

1.环境变量 按用途可分为:与系统运行相关、反应系统状态以及应用程序自定义三种环境变量 操作函数: 获取一个环境变量的值:GetEnvironmentVariable 设置新变量或删除已有变量...
  • kisbuddy
  • kisbuddy
  • 2011-08-21 15:45:12
  • 1497

罗云彬win32汇编教程笔记 Win32汇编的全局变量与局部变量

Win32汇编的全局变量与局部变量 变量的值在程序运行中是需要改变的,所以它必须定义在可写的段内,如 .data和 .data?,或者在堆栈内。 按照定义的位置不同,MASM中的变量也分为全局变量...
  • cay22
  • cay22
  • 2012-03-12 17:14:39
  • 3768
收藏助手
不良信息举报
您举报文章:WIN32汇编第二遍(1)
举报原因:
原因补充:

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