Masm32多模块程序设计:1、掌握利用LINK将多模块连接起来的方法 2、掌握利用库文件将多模块连接起来的方法。
程序使用原代码
实验实验源代码请点击这里
1、掌握利用LINK将多模块连接起来的方法
设计代码如下:
;//主程序,主程序,主程序,主程序,主程序,主程序,主程序,主程序,主程序,主程序,主程序,主程序
.686
.387.model flat, stdcall
option casemap : noneinclude windows.inc
include kernel32.inc
include user32.incincludelib kernel32.lib
includelib user32.lib
;includelib mylib.lib;引用自己设计的库extrn result:REAL4 ;EXTERN在汇编中用来引用一个在其他模块中定义过的符号名,使得这个符号名所表示的数据或函数能在该模块中被使用。
extrn deal:near.data
Table EQU THIS BYTE;//宏定义 定义了9个初值分别为1,2,3,4...9的字节单元,Table为这些字节单元的首地址COUNT = 1REPT 9DB COUNTCOUNT = COUNT + 1
ENDMT DW ?
ZERO REAL4 0.0.code
start :MOV CX, 9;//设置循环次数FLD ZERO;//给栈顶置零LEA ESI, Table;//把DS:Table的偏移地址给ESI,用于寄存器间接寻址
sum:CMP CX, 0JE calculation;//如果CX为零则跳转到calculation段MOV AX, 0MOV AL, [ESI]MOV T, AXFILD T;//FILD指令将16位 32位或者64位有符号整数源操作数转换为双精度浮点数,并加载到ST(0)。源操作数符号保留。FILD支持的内存操作数类型和MOV一致FADDADD ESI, 1LOOP sum;//本来这句是CX为零就不执行跳转的语句,但是不知道为什么没有实现????
calculation:FSTP resultcall deal;进入子程序invoke ExitProcess,NULL
end start;//子程序,子程序,子程序,子程序,子程序,子程序,子程序,子程序,子程序,子程序,子程序
.686
.387.model flat, stdcall
option casemap : noneinclude windows.inc
include kernel32.inc
include user32.incincludelib kernel32.lib
includelib user32.lib
includelib mylib.libpublic deal;该伪指令告诉汇编程序放在PUBLIC之后的标识符(本模块的定义的)可为其他模块使用,这些标识符可以是变量,标号或者过程名.
public result.data
result REAL4 ?
F REAL4 ?
L1 REAL4 0.000001; 32位
C1 REAL4 0.000001
TWO REAL4 2.0
ONE REAL4 1.0
_size DW 80.codedeal proc c ;proc是定义子程序的伪指令,位置在子程序的开始处,它和endp分别表示子程序定义的开始和结束两者必须成对出现。;我也没搞懂为啥要写proc c ,有知道的可以帮忙解释FLD L1; //将L1入栈FMUL C1; //ST < -(C1) * (ST)FSQRT; //ST < -sqrt(ST)FMUL TWO; //ST < -(TWO) * (ST)FLDPI; //ST < -PIFMUL;//ST<-ST(1)*STFLD ONE;//ST <- 1FDIVR;//ST <- ST/ST(1)FLD resultFMULFSTP F;//F<-STret;ret指令的内部操作是:栈顶字单元出栈,其值赋给IP寄存器。即实现了一个程序的转移,将栈顶字单元保存的偏移地址作为下一条指令的偏移地址。;这里就理解成返回到主程序的子程序入口指令的下一条指令deal endp
end
调试程序方法,因为没有交互式输出,我们采用调试的方式查看程序结果,如果要查看子程序的变量值,就要在子程序中加入断点,具体操作如下:
F10单步调试,通过监视窗口可见到ST0的值为:7161972.4572175322(没错就是这个)
或者可按照书上的link两个obj文件,生成一个.exe文件是可行的,下面我们来探索比较复杂的库文件方法。
2、掌握利用库文件将多模块连接起来的方法。
在自己的项目文件中->Debug文件夹中找到子程序的.obj文件复制到masm32文件夹的bin目录下,因为不想一会儿敲文件地址。。。
打开命令行程序,进入到masm32的bin目录下,执行如下操作,即可生成mylib.lib文件:
然后一定要把生成的mylib.lib文件放在masm32的lib中,千万要看到,我就不插图了,费劲死了。
为了实验的正确性,我们删除项目中的deal.asm(子程序)代码,和Debug中的deal.obj(子程序obj文件),将文件中的includelib mylib.lib的注释取消。Ctrl+F7重新编译一下:
先F10单步调试,然后在调试->窗口->反汇编(最下面,一定要先开调试,再找),然后在反汇编界面找到deal子程序(可能需要稍微往下翻一翻),然会在反汇编的第一行代码加断点,F5跳到断点,F10单步执行就可以查看了。。。(好麻烦,我就摸索出来这一种,如果谁有更好的方法,请大神留言)。
比较繁琐,如果读者有更好的方式能调试汇编库函数,请与我联系。
本内容重点在于如何使用多模块程序设计,具体代码如何区分主次(主模块,子模块)要凭读者的意愿和经验去主动分析,反正别和我的一样就行我的垃圾。
Masm32多模块程序设计:1、掌握利用LINK将多模块连接起来的方法 2、掌握利用库文件将多模块连接起来的方法。相关推荐
- 【蓝桥杯嵌入式】比赛笔记(2)根据固件库快速配置各模块初始化
[蓝桥杯嵌入式]比赛笔记(2)根据固件库快速配置各模块初始化 因为蓝桥杯比赛时间很短,并且如果自己去记忆各模块初始化的话,也难免有问题,所以这里给出一个通过固件库的快速初始化模块的方法. 比赛提供固件 ...
- matlab 仿真元件封装,利用M文件与封装模块简化Simulink仿真模型.pdf
第27卷 第10期 计算机工程 2001年10只 V(,{.27N010 ComputerEngineering October2001 立献标识码:" ·软件技术与数据库· 文童编号:10 ...
- python的文件操作、模块操作、os模块、time、datatime模块以及模块的制作
Day12新手小白学python 第十二节 python的文件操作.模块操作.os模块.time.datatime模块以及模块的制作 目录 Day12新手小白学python 前言 一.文件打开关闭 二 ...
- python文件操作和模块
目录 文件操作 文件备份 文件定位 模块导入 os模块制作 文件操作 文件操作的一般步骤: 打开文件.读/写文件 .保存文件 .关闭文件 打开文件用open函数,一般我们默认的编码是gbk,最好的习惯 ...
- 11. 文件操作与模块
目录 一.文件操作 (一)文件打开和关闭 (二)文件读写 文件打开模式:w w+ wb+ (二进制格式打开文件) [写文件] 文件打开模式:r r+(只读) rb rb+(二进制格式 ...
- 文章学习(一)方法类:利用CNN从专利图像导出设计特征向量
Deriving Design Feature Vectors for Patent Images Using Convolutional Neural Networks(Journal of Mec ...
- stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭
stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...
- 基于区块链的Smart系统-题库及试卷管理模块的设计与开发
1引言 1.1课题背景 随着网络技术的飞速发展,现在很多国外的大学和社会其他部门都已经开设了远程教育,通过计算机网络实现异地教育和培训.现在,计算机硬件技术的发展已经达到了相当高的水平.但是,远程 ...
- 【花雕体验】14 行空板pinpong库测试外接传感器模块
1.pinpong库是一套控制开源硬件主控板的Python库,基于Firmata协议并兼容MicroPython语法,5分钟即可让你上手使用Python控制开源硬件.借助于pinpong库,直接用Py ...
最新文章
- linux DNS配置详解
- MessageBox不能应用皮肤的解决办法
- 介绍开源的.net通信框架NetworkComms
- workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...
- linux 常用命令02--文件属性 以及软硬链接
- 【笔记】解析MP3文件信息
- 11.2.0.3.0 PATCH SET FOR ORACLE DATABASE SERVER for windows (32bit)
- DWR Server Push(服务器推技术) 实现即时聊天功能(WEB)
- 无人驾驶技术(交通标志识别)
- Axure R8学习记录
- thinkphp5.1和5.0下的中文分词
- 验证sqlserver 2000 sp4补丁是否安装成功(安装补丁后可以远程访问)
- 24个基本指标精粹讲解(3)--WR
- 2022细胞生物学实验原理复习资料汇总
- 翻译:SQL Server 2005中的覆盖索引
- 一年内经验前端面试题记录
- snprintf函数的用法详解
- Erlang词法分析器、语法分析器(lexer-leex,yac-yecc)
- BIRT 使用说明书
- 前端页面项目——博客系统