汇编语言PROC和ENDP伪指令:定义一个过程

24 篇文章 2 订阅
23 篇文章 0 订阅

如果大家已经学过了高级编程语言,那么就会知道将程序分割为子过程(subroutine)是多么有用。一个复杂的问题常常要分解为相互独立的任务,这样才易于被理解、实现以及有效地测试。

 

在汇编语言中,通常用术语过程(procedure)来指代子程序。在其他语言中,子程序也被称为方法或函数。

就面向对象编程而言,单个类中的函数或方法大致相当于封装在一个汇编语言模块中的过程和数据集合。汇编语言出现的时间远早于面向对象编程,因此它不具备面向对象编程中的形式化结构。汇编程序员必须在程序中实现自己的形式化结构。

定义过程

过程可以非正式地定义为:由返回语句结束的已命名的语句块。过程用 PROC 和 ENDP 伪指令来定义,并且必须为其分配一个名字(有效标识符)。到目前为止,所有编写的程序都包含了一个名为 main 的过程,例如:

main PROC
.
.
main ENDP

当在程序启动过程之外创建一个过程时,就用 RET 指令来结束它。RET 强制 CPU 返回到该过程被调用的位置:

sample PROC
    .
    .
    ret
sample ENDP

过程中的标号

默认情况下,标号只在其被定义的过程中可见。这个规则常常影响到跳转和循环指令。在下面的例子中,名为 Destination 的标号必须与 JMP 指令位于同一个过程中:

jmp Destination

解决这个限制的方法是定义全局标号,即在名字后面加双冒号 (::)。

Destination::

就程序设计而言,跳转或循环到当前过程之外不是个好主意。过程用自动方式返回并调整运行时堆栈。如果直接跳出一个过程,则运行时堆栈很容易被损坏。

示例:三个整数求和

现在创建一个名为 SumOf 的过程计算三个 32 位整数之和。假设在过程调用之前,整数已经分配给 EAX、EBX 和 ECX。过程用 EAX 返回和数:

  SumOf PROC      add eax,ebx      add eax,ecx      ret  SumOf ENDP

过程说明

要培养的一个好习惯是为程序添加清晰可读的说明。下面是对放在每个过程开头的信息的一些建议:

  • 对过程实现的所有任务的描述。
  • 输入参数及其用法的列表,并将其命名为 Receives ( 接收 )。如果输入参数对其数值有特殊要求,也要在这里列岀来。
  • 对过程返回的所有数值的描述,并将其命名为 Returns ( 返回 )。
  • 所有特殊要求的列表,这些要求被称为先决条件 (preconditions),必须在过程被调用之前满足。列表命名为 Requires。例如,对一个画图形线条的过程来说,一个有用的先决条件是该视频显示适配器必须已经处于图形模式。

上述选择的描述性标号,如 ReceivesReturns 和 Requires,不是绝对的;其他有用的名字也常常被使用。

有了这些思想,现在对 SumOf 过程添加合适的说明:

  ;-------------------------------------------------------  ; sumof  ; 计算 3 个 32 位整数之和并返回和数。  ; 接收:EAX、EBX和ECX为3个整数,可能是有符号数,也可能是无符号数。  ; 返回:EAX=和数  ;------------------------------------------------------  SumOf PROC      add eax,ebx      add eax,ecx      ret  SumOf ENDP

用高级语言,如 C 和 C++,编写的函数,通常用 AL 返回 8 位的值,用 AX 返回 16 位的值,用 EAX 返回 32 位的值。

推荐学习目录:PROC和ENDP伪指令

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言中,数据段用来定义数据。一个数据段可以包含多个数据项,每个数据项都有一个标识符和一个数据类型。数据段的定义通常包括以下步骤: 1. 声明数据段的开始和结束:使用关键字"data segment"来声明数据段的开始,在数据项定义完之后使用关键字"data ends"来声明数据段的结束。 2. 定义数据项:在数据段内部,可以使用不同的语句来定义不同类型的数据项。常见的数据类型包括字节、字、双字等。例如,使用关键字"db"可以定义一个字节类型的数据项。 3. 使用数据段:在代码段中,可以使用关键字"assume"来将数据段与代码段进行关联,以便在代码中访问数据段中定义的数据项。 下面是一个示例代码段,其中定义了一个数据段并声明了一个字节类型的数据项: ``` data segment str db 3 dup(5) data ends ``` 在这个示例中,"str"是一个标识符,"db"表示该数据项是一个字节类型的数据项,"3 dup(5)"表示重复3次的字节数据,值为5。这样就定义了一个包含3个字节数据的数据项"str"。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [汇编语言段定义](https://blog.csdn.net/Mr_peng13/article/details/125049123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [汇编学习教程:定义不同的段](https://blog.csdn.net/qq_34149335/article/details/124110122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值