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 ,并请仔细研读其中所附带的文档资料。好,如果您已准备就绪,我们这就开始吧! 理论:         ...

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

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

WIN32汇编定时器的使用

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

win32汇编中伪指令addr和offset指令的区别

一、相同点 1、addr 和 offset 操作符都是获得操作数的偏移地址; 2、addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中。 ...

win32汇编 屏幕截图保存BMP 学习笔记<第三篇>之odbg调试

我们来回顾下raiky code 根据帖子里的讨论错误的疑点在于 1. 对每个像素所占字节的估算可能有误 wBitCount;位图中每个像素所占字节数 简单的赋值4 2. 涉及到后面的调色板的...

Win32汇编——内存管理

一、内存管理基础 1.Windows的内存分层管理图: 2.不同内存管理函数的操作对象图: 3.GlobalMemoryStatus函数通过MEMORYSTATUS结构获取系统内...

win32汇编基础教程

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

Win32汇编扩展教程

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

C指针原理(31)-win32汇编及.NET调试

.NET堆栈原理 1、用调试器调试线程  1)栈调用 以下面代码为例 Imports System.Threading      Public Class Form1   ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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