《Inter汇编语言程序设计》8.6 创建多模块程序(ENTERN)
在此章节之前,创建的程序全部是只用一个模块的,也就是程序中只用了一个END指令,这里通过创建ArraySum例子程序演示创建多模块程序的方法。
首先通过使用ENTERN伪指令创建传统的多模块程序,这里的ENTERN伪指令实际上只起了调用其他模块里的过程前对此过程的声明作用。这里的被调用过程与一个模块表达式没有书写格式上的变化,源程序如下:
(_prompt.asm模块)
TITLE Prompt For Integers (_prompt.asm)INCLUDE Irvine32.inc
.code
;----------------------------------------------------
PromptForIntegers PROC; 提示用户输入三个整数,调用ReadInt读取输入返回到eax中,
; 然后把值插入到数组中.
; 参数:
; ptrPrompt:PTR BYTE ; 提示用户的字符串
; ptrArray:PTR DWORD ; 数组首地址
; arraySize:DWORD ; 数组的长度
; 返回值:无
;-----------------------------------------------------
arraySize EQU [ebp+16]
ptrArray EQU [ebp+12]
ptrPrompt EQU [ebp+8] ; [ebp+8]指向调用此模块(call指令)之前的入栈数据enter 0,0
; enter指令自动为被调用过程创建堆栈框架(此处相当于push ebp;mov ebp,esp;sub esp,0),
; 并为局部变量创建堆栈空间(enter 0,0 前一个0表示局部变量占用的字节数,
; 后一个0表示从调用过程复制到当前堆栈框架中的堆栈框架指针的数目)pushad ; 8个通用寄存器入栈mov ecx,arraySize ; ecx表示数组的大小,这里同时是循环计数器cmp ecx,0 ; 循环计数器 <= 0?jle L2 ; 是:跳过循环体mov edx,ptrPrompt ; 否:把提示字符串首地址传递给edxmov esi,ptrArray ; esi指向数组的首地址L1: call WriteString ; 预先定义的过程,输出edx代表的字符串call ReadInt ; 等待用户输入后,从标准输入中读取一个32位有符号整数并在eax中返回call Crlf mov [esi],eax ; 把输入的值存储在数组中add esi,4 ; esi指向数组下一个元素loop L1L2: popad ; 8个通用寄存器出栈leave
; leave指令释放一个过程的堆栈框架,执行与enter相反的动作(此处相当于mov esp,ebp;pop ebp)
; 如果enter指令创建了局部变量,leave还要释放局部变量占用的堆栈空间ret 12
; 调用此模块前,主模块会把此模块用到的相应参数入栈,这里12表示此模块结束后释放主模块中占用的堆栈空间
; 相当于依次执行ret;add esp,12的指令
PromptForIntegers ENDP
END
(_arrysum.asm模块):
TITLE ArraySum Procedure (_arrysum.asm)INCLUDE Irvine32.inc
.code
ArraySum PROC
;
; 计算有符号32位整数数组的各元素总和
; 参数:
; ptrArray ; 指向数组首地址
; arraySize ; 数组的长度(DWORD)
; 返回值: EAX = sum
;-----------------------------------------------------
ptrArray EQU [ebp+8]
arraySize EQU [ebp+12]enter 0,0 ; enter指令创建堆栈框架,此处无局部变量push ecx ; 提示:eax作为返回值,不能入栈push esimov eax,0 ; 初始化数组总和为0mov esi,ptrArray ; 数组首地址mov ecx,arraySize ; 数组大小,同时是循环计数器cmp ecx,0 ; 循环计数器 <= 0?jle L2 ; 是: 跳过循环体L1: add eax,[esi] ; 否:把数组一个元素加到eax中add esi,4 ; 指向下一个数组元素loop L1L2: pop esipop ecx ; 总和通过eax返回到调用过程(主模块)leave ; 释放enter创建的堆栈框架ret 8 ; 释放调用过程中(主模块)的参数通过堆栈传递时占用的堆栈空间
ArraySum ENDP
END
(_display.asm模块):
TITLE DisplaySum Procedure (_display.asm)INCLUDE Irvine32.inc
.code
;-----------------------------------------------------
DisplaySum PROC; 在控制台窗口中显示总和的值
; 参数:
; ptrPrompt ; 提示字符串首地址
; theSum ; 数组各元素总和(DWORD)
; 返回值: 无
;-----------------------------------------------------theSum EQU [ebp+12]
ptrPrompt EQU [ebp+8]enter 0,0 ; enter指令创建堆栈框架,此处无局部变量push eaxpush edxmov edx,ptrPrompt ; 预先定义的过程参数call WriteString ; 输出提示字符串到屏幕mov eax,theSum ; 预先定义的过程参数call WriteInt ; 输出数组总和到屏幕call Crlfpop edxpop eaxleaveret 8 ; 返回到主模块并释放主模块调用此过程时占用的堆栈空间
DisplaySum ENDP
END
(Sum_main.asm主模块):
TITLE Integer Summation Program (Sum_main.asm); 多模块程序例子: (主模块/启动模块)
; 这个程序提示用户输入3个32位有符号整数,
; 然后把输入的整数存储到数组中并计算这个数组的总和,
; 显示数组的总和到屏幕INCLUDE Irvine32.inc ;INCLUDE 伪指令包含用户定义的.inc文件,其中可集中放置变量或过程的声明等信息EXTERN PromptForIntegers@0:PROC ; EXTERN 伪指令在调用外部模块中的过程前声明,@0表示PromptForIntegers过程没有PROC伪指令参数
EXTERN ArraySum@0:PROC, DisplaySum@0:PROC ; EXTERN 伪指令在调用外部模块中的过程前声明,其余同上; 为被调用过程赋予其他的标号,方便主模块调用
ArraySum EQU ArraySum@0
PromptForIntegers EQU PromptForIntegers@0
DisplaySum EQU DisplaySum@0Count = 3 ; 标号代表定义数组的大小.data
prompt1 BYTE "Enter a signed integer: ",0
prompt2 BYTE "The sum of the integers is: ",0
array DWORD Count DUP(?) ; 定义包含count个元素的未初始化数组
sum DWORD ?.code
main PROCcall Clrscr ; 清理屏幕; 调用PromptForIntegers( addr prompt1, addr array, Count ),括号中为向被调用过程包含的参数push Countpush OFFSET arraypush OFFSET prompt1call PromptForIntegers; 调用eax = ArraySum( addr array, Count ),其中eax是被调用过程的返回值push Countpush OFFSET arraycall ArraySummov sum,eax; 调用DisplaySum( addr prompt2, sum )push sumpush OFFSET prompt2call DisplaySumcall Crlfexit
main ENDPEND main
下面是这个程序运行的结果:
《Inter汇编语言程序设计》8.6 创建多模块程序(ENTERN)相关推荐
- 汇编语言程序设计读书笔记(4)- 程序设计基础之一
程序设计基础部分主要内容包含数据定义,数据传输,寻址方式,汇编指令等等.涉及的内容较多,用多篇文章才可叙述完. 一.数据定义 汇编程序可以定义赋予了初始值的数据,且该数据在程序代码中是可改变值的,类似 ...
- 南邮汇编语言程序设计实验二————用户登录验证程序的设计
目录 实验环境(实验设备) 实验要求 实验代码 相关函数 实验结果 实验环境(实验设备) 硬件:微型计算机 软件:Windows 操作系统.汇编语言开发工具MASM或TASM 实验要求 1. 程序执行 ...
- 《汇编语言程序设计》(双语)上机指导
唔.省得每次忘带U盘... <汇编语言程序设计>(双语)上机指导... 1 实验1 建立windows环境下32位汇编语言开发环境... 2 实验2 Instruction Format ...
- Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)
Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(畅销10年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 75 ...
- 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...
- 《汇编语言程序设计》——仿windows计算器
<汇编语言程序设计> --计算器程序设计 目录 一. 题目与目标 1. 题目 2. 学习目的 二. 分析与设计 1. 系统分析 2. ...
- Windows环境下32位汇编语言程序设计(典藏版)
<Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...
- Intel汇编语言程序设计学习-第一章 基本概念
第一章基本概念 1.1 简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...
- 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】答案
内容修订.解析.扩展: <IBM-PC汇编语言程序设计>(第2版)[沈美明 温冬婵]--自编解析与答案 第 一 章. 习 题 1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数 ...
- 计算机专业需要汇编语言,重点大学计算机专业系列教材·汇编语言程序设计
重点大学计算机专业系列教材·汇编语言程序设计 语音 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! <重点大学计算机专业系列教材·汇编语言程 ...
最新文章
- 厉害了程序员~凡尔赛文学现作 | 每日趣闻
- 《拥抱变化——社交网络时代的企业转型之道》一构筑社会信任
- 研究优雅停机时的一点思考
- 1.VMware安装3个ubuntu14.05
- 这文字的起始位置_ae制作文字动画?ae文字动画教程
- python画图猪_用Python的turtle画一只小猪乔治【刚学python两天,记念一下】
- Maven : maven异常记录-must be unique maven duplicate declaration of version
- javaweb网上订餐系统源码_【有源码】毕设网上订餐系统
- 在文本和图像上的对比学习小综述~
- Noip前的大抱佛脚----文章索引
- Javascript浏览器事件(上)
- 優利系統眾裡尋“她”
- androidid什么时候会变_高瓷绿松石是什么意思?为何绿松石的瓷度要比颜色重要?...
- 家用风扇控制系统c语言程序设计,[信息与通信]家用风扇控制系统.doc
- MSSQL父子关系表的SQL查询(SQL Query for Parent Child Relationship)
- wampserver显示红色、橙色的解决方案
- Android界面隐藏软键盘的探索(兼findViewById返回null解决办法)
- ensp MSTP实验搭建
- 程序史记:从巴贝奇、爱达到图灵
- 什么是大数据,猴子怎么看大象(1)