程序使用原代码

实验实验源代码请点击这里

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、掌握利用库文件将多模块连接起来的方法。相关推荐

  1. 【蓝桥杯嵌入式】比赛笔记(2)根据固件库快速配置各模块初始化

    [蓝桥杯嵌入式]比赛笔记(2)根据固件库快速配置各模块初始化 因为蓝桥杯比赛时间很短,并且如果自己去记忆各模块初始化的话,也难免有问题,所以这里给出一个通过固件库的快速初始化模块的方法. 比赛提供固件 ...

  2. matlab 仿真元件封装,利用M文件与封装模块简化Simulink仿真模型.pdf

    第27卷 第10期 计算机工程 2001年10只 V(,{.27N010 ComputerEngineering October2001 立献标识码:" ·软件技术与数据库· 文童编号:10 ...

  3. python的文件操作、模块操作、os模块、time、datatime模块以及模块的制作

    Day12新手小白学python 第十二节 python的文件操作.模块操作.os模块.time.datatime模块以及模块的制作 目录 Day12新手小白学python 前言 一.文件打开关闭 二 ...

  4. python文件操作和模块

    目录 文件操作 文件备份 文件定位 模块导入 os模块制作 文件操作 文件操作的一般步骤: 打开文件.读/写文件 .保存文件 .关闭文件 打开文件用open函数,一般我们默认的编码是gbk,最好的习惯 ...

  5. 11. 文件操作与模块

    目录 一.文件操作 (一)文件打开和关闭 (二)文件读写 文件打开模式:w w+  wb+ (二进制格式打开文件)     [写文件] 文件打开模式:r  r+(只读)   rb  rb+(二进制格式 ...

  6. 文章学习(一)方法类:利用CNN从专利图像导出设计特征向量

    Deriving Design Feature Vectors for Patent Images Using Convolutional Neural Networks(Journal of Mec ...

  7. stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭

    stm32f103c8t6+ESP8266利用onenet平台上传数据到云平台,再利用云平台远程下发命令给单片机控制LED灯亮灭 接触stm32已经有一年半的时间了,从最开始的stm32F103ZET ...

  8. 基于区块链的Smart系统-题库及试卷管理模块的设计与开发

      1引言 1.1课题背景 随着网络技术的飞速发展,现在很多国外的大学和社会其他部门都已经开设了远程教育,通过计算机网络实现异地教育和培训.现在,计算机硬件技术的发展已经达到了相当高的水平.但是,远程 ...

  9. 【花雕体验】14 行空板pinpong库测试外接传感器模块

    1.pinpong库是一套控制开源硬件主控板的Python库,基于Firmata协议并兼容MicroPython语法,5分钟即可让你上手使用Python控制开源硬件.借助于pinpong库,直接用Py ...

最新文章

  1. linux DNS配置详解
  2. MessageBox不能应用皮肤的解决办法
  3. 介绍开源的.net通信框架NetworkComms
  4. workflow java_workflow java实现的activity工作流实例 Develop 238万源代码下载- www.pudn.com...
  5. linux 常用命令02--文件属性 以及软硬链接
  6. 【笔记】解析MP3文件信息
  7. 11.2.0.3.0 PATCH SET FOR ORACLE DATABASE SERVER for windows (32bit)
  8. DWR Server Push(服务器推技术) 实现即时聊天功能(WEB)
  9. 无人驾驶技术(交通标志识别)
  10. Axure R8学习记录
  11. thinkphp5.1和5.0下的中文分词
  12. 验证sqlserver 2000 sp4补丁是否安装成功(安装补丁后可以远程访问)
  13. 24个基本指标精粹讲解(3)--WR
  14. 2022细胞生物学实验原理复习资料汇总
  15. 翻译:SQL Server 2005中的覆盖索引
  16. 一年内经验前端面试题记录
  17. snprintf函数的用法详解
  18. Erlang词法分析器、语法分析器(lexer-leex,yac-yecc)
  19. BIRT 使用说明书
  20. 前端页面项目——博客系统

热门文章

  1. c语言字符串差集,数组求交集并集差集问题
  2. 盘古开源丨大数据产业价值持续释放,有效推动数字化转型升级
  3. 【够全面够清晰】Linux超强学习路线图(思维导图)
  4. 计算机硬盘瓶颈,解决电脑速度的关键瓶颈是升级硬盘!618硬盘选购攻略了解一下?...
  5. ListView 的 performItemClick使用
  6. 凑零钱(递归法简洁AC)
  7. 计算机视觉图像常用基本算法(阈值化、形态学变化、模糊)
  8. Excel 公式(sumif, sumproduct)
  9. laravel-orm
  10. 1152 最大值和最小值