windows环境下32位汇编语言程序设计附书代码
- 格式:docx
- 大小:29.83 KB
- 文档页数:8
Windows版本我们也可以建一个Windows版的Hello World!程序。
将下面的代码粘贴到文本编辑器中并保存为“Hellow.asm”。
.386.model flat, stdcalloption casemap :noneinclude \masm32\include\windows.incinclude \masm32\include\kernel32.incinclude \masm32\include\user32.incincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\user32.lib.dataHelloWorld db "Hello World!", 0.codestart:invoke MessageBox, NULL, addr HelloWorld, addr HelloWorld, MB_OKinvoke ExitProcess, 0end start现在,再次打开命令行并进入到保存“Hellow.asm”的目录里。
输入"\masm32\bin\ml /c /Zd /coff hellow.asm"。
然后再输入“\masm32\bin\Link /SUBSYSTEM:WINDOWS hellow.obj”,注意参数中的subsystem选项又原来的CONSOLE替换成了WINDOWS。
这个程序将会弹出一个对话框来显示“Hello World!”。
Windows版本和控制台版本仅仅有3行代码不同。
首先两处更改的是为了我们现在能使用MessageBox函数来替换之前的StdOut,必须加入user32的包含文件和库文件。
第三个改变就是使用MessageBox函数来替换StdOut函数。
完了,就这些。
ADDR vs OFFSET在我们的Hello World!例子中,我们使用了‘addr’来获取“Hello World”字符串的地址。
使用VisualStudio2015调试罗云彬的32位汇编语言附属光盘中的汇编源代码(第三版琢石成器版)整理:太虚野老本文介绍使用Visual Studio 2015 调试汇编源代码。
以罗云彬的《Windows环境下32位汇编语言程序设计(最新琢石成器版)》附属光盘中的汇编源代码为例。
1.创建ASM项目打开Visual Studio 2015,选择新建一个VC++项目。
选择“空项目”,输入项目名称,点确定。
在工程中的“源文件”文件夹新建“.asm”类型的源文件:在这里会发现不能新建“.asm”类型的文件,选择“C++文件(.cpp)”,然后在文件结尾加上扩展名.asm。
现在项目和源文件都有了,但是这毕竟是个VC++的空项目,VC++项目在默认情况下是不会编译.asm类型的源文件的。
所以你点击“生成解决方案”发现根本什么都没有生成,Debug文件夹是空的,就会出现这样的现象。
事实上在创建源文件时,可以使用任意格式的源文件。
例如使用文本文件:要经过下面两步设置。
第一步,右击解决方案选择“生成依赖项”→“生成自定义”:把“MASM”那项勾上,确定。
第二步,右击你创建的.asm源文件,选择属性,在配置属性->常规->项类型下拉菜单中选择“Microsoft Macro Assembler”。
这样就指定了你源文件的类型是.asm格式的,如果不指定默认就是按照.cpp也就是c++语法去编译自然是行不通的。
设置这些之后还要去修改项目配置,这样程序才能得以运行。
这包括是否连接其他的库文件(.lib)、是否调试、子系统的原型环境。
这些全部都在项目属性中设置。
打开项目属性的方法:你可以在刚才右键点“生成自定义”那里选择最下面的属性,也可以在项目选项卡里找到“属性”一项然后选择。
选择配置属性->连接器。
把调试->生成调试信息改为“是(/Debug)”。
在Visual Studio 2015中默认是“true”;把系统->子系统改为“控制台(/SUBSYSTEM:CONSOLE)”:头文件在vs的include中是没有的,需要从masm32中引用过来,所以需要添加如下目录:masm32中的inc的头文件包含在include目录中。
实验1 win 32汇编程序的编程环境实验步骤:1安装开发环境解压masm32v11r.zip,并运行MASM32 SDK开发软件“install.exe”,将MASM32安装在根目录下。
2 EditPlus多功能编辑器EditPlus的配置方法如下:1、在“工具”->“首选项…”中转到“文件类型及语法”。
2、在“文件类型”中选中WIN32ASM文件类型,并进行修改,将文件扩展名设为“ASM”,扩展名设为“ASM”。
语法文件选择asm.stx。
3 定制开发环境为这个环境建立一个设置环境变量的批处理文件 Var.bat,其内容如下:@echo offset Masm32Dir=f:\Masm32set include=%Masm32Dir%\Include;%include%set lib=%Masm32Dir%\lib;%lib%set path=%Masm32Dir%\Bin;%Masm32Dir%;%PATH%set Masm32Dir=echo on文件中设置了3个环境变量:●include变量指定头文件的搜索目录。
在asm和rc文件中可以根据这个变量寻找include语句指定的文件名,避免了使用头文件的全路径名,这样以后移动了MASM32的安装位置就不必修改每个源文件中的include语句。
如果使用Visual C++的集成环境来建立rc文件的话,为了使rc.exe 能找到头文件,还要把VC++安装目录下的Include和MFC\Include目录包含进来,多个路径之间用“;”隔开;● lib变量指定导入库文件的搜索目录。
在asm文件中可以根据这个变量寻找includelib语句指定的导入库文件,Link.exe也根据这个变量寻找库文件的位置。
● path变量就不必多解释了。
它只是使我们不必在键入命令时带长长的路径而已。
4、使用EditPlus建立TEST.asm源程序并保存.386.model flat,stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.lib.constszCaption db '恭喜',0szText db '当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0.codestart:invoke MessageBox,NULL,offset szText,offset szCaption,MB_OKinvoke ExitProcess,NULLend start5 、建立汇编连接32位应用程序的makefile文件make可以根据文件的时间正确判断文件的新旧并执行相应的步骤。
第1章背景知识让我们在轻松的背景知识介绍中开始Win32汇编之旅。
本章将对Win32平台的历史和现状做简要介绍,同时对80386处理器以及Windows操作系统中涉及Win32汇编的基础知识部分做快速充电。
1.1 Win32的软硬件平台1.1.1 80x86系列处理器简史Win32可以在多种硬件平台上运行,但使用最广泛的硬件平台是基于Intel公司80x86系列处理器的微型计算机。
自1978年6月Intel公司推出它的第一个16位微处理器8086以来,计算机技术就开始进入飞速发展的时期。
8086芯片的主频为4.43 MHz,集成的晶体管数大约为2.9万个,运算器的位长为16位,采用了20条地址线,可以寻址的范围为220个字节地址,即1 MB;1982年,该公司发布了80286处理器,芯片上集成了12万个晶体管,主频提高到了12 MHz。
1985年Intel公司推出32位的80386处理器,芯片上集成的晶体管数为27.5万个,主频提高到了33 MHz,地址线则扩展为32条,直接寻址的能力达到4 GB。
80386处理器在设计的时候考虑了多用户及多任务的需要,在芯片中增加了保护模式、优先级、任务切换和片内的存储单元管理等硬件单元。
80386的出现使Windows和UNIX等多任务的操作系统可以在PC上运行。
直到现在,运行于80x86处理器之上的多任务操作系统都是以80386的运行模式为基础的。
1989年,Intel公司推出80486处理器,在芯片内集成了浮点处理器和8 KB的一级缓存,片内的晶体管数达到了118万个,并把主频提高到50 MHz~66 MHz。
80486处理器开始使用流水线技术,即在CPU中由5~6个不同功能的电路单元组成一条指令处理流水线,然后将一条指令分成5~6步后再由这些电路单元分别执行,由此提高CPU的运算速度。
电路单元的数目就是流水线的深度。
为了使计算机中的其他部件不至于成为CPU速度发展的瓶颈,80486处理器开始使用了倍频技术,即让处理器速度(CPU主频)数倍于系统总线速度(外频)。
windows环境下32位汇编语言程序设计附书
代码
汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交
互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:
在32位汇编语言中,程序的基本结构由三个部分组成:数据段、
代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,
下面的代码段声明了一个全局变量message,存储了一个字符串。
```
data segment
message db 'Hello, World!',0
data ends
```
代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```
code segment
start:
mov eax, offset message
mov ah, 09h
int 21h
mov ah, 4ch
int 21h
code ends
```
堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:
在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```
push reg ;将reg中的值压入堆栈
pop reg ;将堆栈顶部的值弹出到reg中
```
下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:
```
code segment
start:
push eax ;将eax保存到堆栈
mov eax, 10 ;设置eax的值为10
pop ebx ;将堆栈顶部的值弹出到ebx
add eax, ebx ;将eax和ebx相加
int 3 ;调试中断,用于程序的暂停
mov ah, 4ch
int 21h
code ends
```
3.条件判断和跳转指令:
汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
以下是一些常用的条件判断和跳转指令: ```
cmp reg1, reg2 ;比较reg1和reg2的值
jmp label ;无条件跳转到label标签处
je label ;当前两个操作数相等时跳转到label 标签处
jne label ;当前两个操作数不相等时跳转到label标签处
jz label ;当前操作数为0时跳转到label标签处
jnz label ;当前操作数不为0时跳转到label标签处
```
下面的代码演示了如何使用条件判断和跳转指令来实现循环:
```
code segment
start:
mov ecx, 0 ;初始化计数器ecx为0
loop:
add ecx, 1 ;将计数器ecx加1
cmp ecx, 10 ;比较计数器ecx和10的值
jge end ;如果ecx大于等于10,跳转到end标签处
int 3 ;调试中断,用于程序的暂停
jmp loop ;无条件跳转到loop标签处
end:
mov ah, 4ch
int 21h
code ends
```
4.输入和输出操作:
在汇编语言中,我们可以使用系统调用来进行输入和输出操作。
其中,MS-DOS功能16用于读取字符,MS-DOS功能1用于显示字符。
下面的代码演示了如何使用MS-DOS功能16来读取一个字符,并使用MS-DOS功能1将该字符显示出来:
```
data segment
buffer db 1
data ends
code segment
start:
mov ah, 0 ;设置MS-DOS功能号为0
int 21h ;调用MS-DOS功能16来读取字符mov dl, buffer ;将读取的字符保存到dl寄存器mov ah, 2 ;设置MS-DOS功能号为2
int 21h ;调用MS-DOS功能1来显示字符mov ah, 4ch
int 21h
code ends
```
以上是一些在Windows环境下使用32位汇编语言进行程序设计的示例。
通过学习和实践这些示例,你可以进一步了解和掌握汇编语言的编程技巧和应用场景。
希望这些代码示例能对你有所帮助。