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汇编入门了解(1)环境搭建

说明:本系列内容不会详细讲解汇编的知识,只是记录我自己学习的一个过程,而且,我学习的目标不是打算写汇编,而是了解一点点win32汇编的知识,只是为了让自己能读懂最基本的汇编。另外,win32汇编的核心...

Win32汇编教程1 - 基本概念

我们先假设您已知道了如何使用MASM。如果您还不知道的话,请下载 win32asm.exe ,并请仔细研读其中所附带的文档资料。好,如果您已准备就绪,我们这就开始吧! 理论:         ...
  • snddman
  • snddman
  • 2011年12月07日 19:54
  • 194

学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

http://www.cnblogs.com/del/archive/2010/04/16/1713886.html 跳转指令分三类: 一、无条件跳转: JMP; 二、根据 CX、ECX 寄存器的值...
  • wwwwws
  • wwwwws
  • 2013年01月31日 12:57
  • 12373

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

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

Win32 汇编 - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等

这里的 "串" 并不单指字符串, 包括所有连续的数据(如数组); 串指令只用于内存操作. 移动串指令: MOVSB、MOVSW、MOVSD ;从 ESI -> EDI; 执行后, ESI 与...
  • BetaBin
  • BetaBin
  • 2012年02月29日 17:15
  • 2296

WIN32汇编定时器的使用

今天学习了定时器的用法,小有感悟,首先是资源脚本中遇到的问题,先上资源脚本文件: // Generated by ResEdit 1.6.6 // Copyright (C) 2006-2015 //...

win32汇编基础教程

Win32汇编教程之一 Win32汇编的环境和基础 1.32位环境简介   在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存...

Win32汇编扩展教程

Win32汇编扩展教程 第一课 Win32 扩展消息框示例 在罗哥云琳的Win32消息框示例基础上,做一个扩展例子。 首先弹出消息框,2个按钮,YESNO; 点击NO,程序结束;点击...

Win32汇编之创建窗口

//////系统将输入设备(键盘,鼠标)的动作记录在系统消息队列中,根据动作产生的窗口就将消息分配到相应的程序消息队列中。 //////模块句柄、文件句柄、窗口句柄、线程句柄 0、创建窗口...

Win32 汇编 - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD

SHL、SHR、SAL、SAR: 移位指令 ;SHL(Shift Left):      逻辑左移 ;SHR(Shift Right):      逻辑右移 ;SAL...
  • BetaBin
  • BetaBin
  • 2012年03月01日 21:22
  • 6661
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WIN32汇编第二遍(1)
举报原因:
原因补充:

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