在此章节之前,创建的程序全部是只用一个模块的,也就是程序中只用了一个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)相关推荐

  1. 汇编语言程序设计读书笔记(4)- 程序设计基础之一

    程序设计基础部分主要内容包含数据定义,数据传输,寻址方式,汇编指令等等.涉及的内容较多,用多篇文章才可叙述完. 一.数据定义 汇编程序可以定义赋予了初始值的数据,且该数据在程序代码中是可改变值的,类似 ...

  2. 南邮汇编语言程序设计实验二————用户登录验证程序的设计

    目录 实验环境(实验设备) 实验要求 实验代码 相关函数 实验结果 实验环境(实验设备) 硬件:微型计算机 软件:Windows 操作系统.汇编语言开发工具MASM或TASM 实验要求 1. 程序执行 ...

  3. 《汇编语言程序设计》(双语)上机指导

    唔.省得每次忘带U盘... <汇编语言程序设计>(双语)上机指导... 1 实验1 建立windows环境下32位汇编语言开发环境... 2 实验2  Instruction Format ...

  4. Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)

    Windows环境下32位汇编语言程序设计(典藏版)(含CD光盘1张)(畅销10年,经典再现!) 罗云彬 著 ISBN 978-7-121-20759-4 2013年7月出版 定价:99.00元 75 ...

  5. 琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记

    琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记 2011年12月20日 基础篇 第1章 背景知识 1 1.1 Win32的软硬件平台 1.1.1 80x86系列处理器简史 1.1 ...

  6. 《汇编语言程序设计》——仿windows计算器

    <汇编语言程序设计> --计算器程序设计 目录 一.     题目与目标 1.      题目 2.      学习目的 二.     分析与设计 1.      系统分析 2.      ...

  7. Windows环境下32位汇编语言程序设计(典藏版)

    <Windows环境下32位汇编语言程序设计(典藏版) > 基本信息 作者: 罗云彬 出版社:电子工业出版社 ISBN:9787121207594 上架时间:2013-7-8 出版日期:2 ...

  8. Intel汇编语言程序设计学习-第一章 基本概念

    第一章基本概念 1.1  简单介绍 本书着重讲述MS-Windows平台上IA-32(Intel Architecture 32bit,英特尔32位体系架构)兼容微处理器的汇编语言程序设计,可以使用I ...

  9. 《IBM-PC汇编语言程序设计》(第2版)【沈美明 温冬婵】答案

    内容修订.解析.扩展: <IBM-PC汇编语言程序设计>(第2版)[沈美明 温冬婵]--自编解析与答案 第 一 章. 习 题 1.1 用降幂法和除法将下列十进制数转换为二进制数和十六进制数 ...

  10. 计算机专业需要汇编语言,重点大学计算机专业系列教材·汇编语言程序设计

    重点大学计算机专业系列教材·汇编语言程序设计 语音 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! <重点大学计算机专业系列教材·汇编语言程 ...

最新文章

  1. 厉害了程序员~凡尔赛文学现作 | 每日趣闻
  2. 《拥抱变化——社交网络时代的企业转型之道》一构筑社会信任
  3. 研究优雅停机时的一点思考
  4. 1.VMware安装3个ubuntu14.05
  5. 这文字的起始位置_ae制作文字动画?ae文字动画教程
  6. python画图猪_用Python的turtle画一只小猪乔治【刚学python两天,记念一下】
  7. Maven : maven异常记录-must be unique maven duplicate declaration of version
  8. javaweb网上订餐系统源码_【有源码】毕设网上订餐系统
  9. 在文本和图像上的对比学习小综述~
  10. Noip前的大抱佛脚----文章索引
  11. Javascript浏览器事件(上)
  12. 優利系統眾裡尋“她”
  13. androidid什么时候会变_高瓷绿松石是什么意思?为何绿松石的瓷度要比颜色重要?...
  14. 家用风扇控制系统c语言程序设计,[信息与通信]家用风扇控制系统.doc
  15. MSSQL父子关系表的SQL查询(SQL Query for Parent Child Relationship)
  16. wampserver显示红色、橙色的解决方案
  17. Android界面隐藏软键盘的探索(兼findViewById返回null解决办法)
  18. ensp MSTP实验搭建
  19. 程序史记:从巴贝奇、爱达到图灵
  20. 什么是大数据,猴子怎么看大象(1)

热门文章

  1. 【波形发生器(附源码)】基于DAC+DMA+UART的幅值、频率可调的正弦波、方波、三角波发生器
  2. 建筑工程测量与测绘毕业论文范文
  3. megui 2913 汉化版 压制特效的方法
  4. 海尔构建全球首个智能制造云平台COSMO
  5. 怎么用js代码画一棵树,附带下载链接
  6. 【面经】数据开发一面-美团暑期实习
  7. 高三数学辅导:不等式、推理与证明
  8. java实现消息推送_java实现后台服务器消息推送
  9. Oracle VS SAP
  10. FlinkSql系列5之 Regular Join