2025年4月7日 星期一 乙巳(蛇)年 正月初八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > 汇编

汇编语言用Extern伪指令新建模块[附带实例]

时间:03-05来源:作者:点击数:72

本节主要讲解使用传统的 EXTERN 伪指令引用位于不同模块中的函数。

PromptForIntegers

jprompt.asm 是 PromptForIntegers 过程的源代码文件。它显示提示要求用户输入三个整数,调用 Readlnt 获取数值,并将它们插入数组:

  • ;提示整数输入请求 (_prompt.asm)
  • INCLUDE Irvine32.inc
  • .code
  • ;--------------------------------
  • PromptForIntegers PROC
  • ;提示用户为数组输入整数,并用
  • ;用户输入填充该数组。
  • ;接收:
  • ; ptrPrompt:PTR BYTE ;提示信息字符串
  • ; ptrArray:PTR DWORD ;数组指针
  • ; arraySize:DWORD ;数组大小
  • ;返回:无
  • ;--------------------------------
  • arraySize EQU [ebp+16]
  • ptrArray EQU [ebp+12]
  • ptrPrompt EQU [ebp+8]
  • enter 0,0
  • pushad ;保存全部寄存器
  • mov ecx,arraySize
  • cmp ecx,0 ;数据大小WO?
  • jle L2 ;是:退出
  • mov edx,ptrPrompt ;提示信息的地址
  • mov esi,ptrArray
  • L1: call WriteString ;显示字符串
  • call ReadInt ;将整数读入EAX
  • call Crlf ;换行
  • mov [esi],eax ;保存入数组
  • add esi,4 ;下一个整数
  • loop L1
  • L2: popad ;恢复全部寄存器
  • leave
  • ret 12 ;恢复堆栈
  • PromptForIntegers ENDP
  • END

ArraySum

_arraysum.asm 模块为 ArraySum 过程,计算数组元素之和,并用 EAX 返回计算结果:

  • ;ArraySumit程 (_arrysum.asm)
  • INCLUDE Irvine32.inc
  • .code
  • ;----------------------------------------------
  • ArraySum PROC
  • ;计算32位整数数组之和。
  • ;接收:
  • ; ptrArray ;数组指针
  • ; arraySize ;数组大小(DWROD)
  • ;返回:EAX = 和数
  • ;----------------------------------------------
  • ptrArray EQU [ebp+8]
  • arraySize EQU [ebp+12]
  • enter 0,0
  • push ecx ;EAX 不入栈
  • push esi
  • mov eax, 0 ;和数清零
  • mov esi, ptrArray
  • mov ecx,arraySize
  • cmp ecx, 0 ;数组大小WO?
  • jle L2 ;是:退出
  • L1: add eax, [esi] ;将每个整数加到和数中
  • add esi,4 ;指向下一个整数
  • loop L1 ;按数组大小重复
  • L2: pop esi
  • pop ecx ;用EAX返回和数
  • leave
  • ret 8 ;恢复堆栈
  • ArraySum ENDP
  • END

DisplaySum

_display.asm 模块为 DisplaySum 过程,显示标号和和数的结果:

  • ;DisplaySum 过程 (_display.asm)
  • INCLUDE Irvine32.inc
  • .code
  • ;-----------------------------------------
  • DisplaySum PROC
  • ;在控制台显示和数。
  • ;接收:
  • ; ptrPrompt ;提示字符串的偏移量
  • ; theSum ;数组和数(DWROD)
  • ;返回:无
  • ;-----------------------------------------
  • theSum EQU [ebp+12]
  • ptrPrompt EQU [ebp+8]
  • enter 0,0
  • push eax
  • push edx
  • mov edx,ptrPrompt ;提示字符串的指针
  • call WriteString
  • mov eax,theSum
  • call Writelnt ;显示 EAX
  • call Crlf
  • pop edx
  • pop eax
  • leave
  • ret 8 ;恢复堆栈
  • DisplaySum ENDP
  • END

Startup 模块

Sum_main.asm 模块为启动过程 (main)。其中的 EXTERN 伪指令指定了三个外部过程。为了使源代码更加友好,用 EQU 伪指令再次定义了过程名:

ArraySum           EQU ArraySum@0
PromptForIntegers  EQU PromptForIntegers@0
DisplaySum         EQU DisplaySum@0

每次过程调用之前,用注释说明了参数顺序。该过程使用 STDCALL 参数传递规范:

  • ;整数求和过程(Sum_main.asm)
  • ;多模块示例
  • ;本程序由用户输入多个整数,
  • ;将它们存入数组,计算数组之和,
  • ;并显示和数。
  • INCLUDE Irvine32.inc
  • EXTERN PromptForIntegers@0:PROC
  • EXTERN ArraySum@0:PROC, DisplaySum@0:PROC
  • ;为方便起见,重新定义外部符号
  • ArraySum EQU ArraySum@0
  • PromptForIntegers EQU PromptForIntegers@0
  • DisplaySum EQU DisplaySum@0
  • ;修改 Count 来改变数组大小:
  • Count = 3
  • .data
  • prompt1 BYTE "Enter a signed integer: ",0
  • prompt2 BYTE "The sum of the integers is: ",0
  • array DWORD Count DUP(?)
  • sum DWORD ?
  • .code
  • main PROC
  • call Clrscr
  • ;PromptForIntegers (addr prompt1, addr array, Count)
  • push Count
  • push OFFSET array
  • push OFFSET prompt1
  • call PromptForIntegers
  • ;sum = ArraySum(addr array, Count)
  • push Count
  • push OFFSET array
  • call ArraySum
  • mov sum,eax
  • ;DisplaySum(addr prompt2, sum)
  • push sum
  • push OFFSET prompt2
  • call DisplaySum
  • call Crlf
  • exit
  • main ENDP
  • END main
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门