`
qdujunjie
  • 浏览: 110357 次
  • 性别: Icon_minigender_1
  • 来自: Mars
社区版块
存档分类
最新评论

汇编语言表格驱动分支选择代码分析(4)

阅读更多

 

来自于《Intel汇编语言程序设计》(第四版)第六章。

 

 

先引用原书的话来解释一下表格驱动分支选择:

 

表格驱动分支选择是使用表格查找法来替代多路选择结构的一种方法。为了使用该方法,我们必须创建一个包含查找值和过程偏移的表格,程序使用循环来搜索该表格,当需要大量的比较时,这种方法是工作的最好的。

 

下面是书中的例子程序,用户从键盘输入一个字符,程序使用一个循环将该字符同表中的每个子项比较,如果一个匹配项被发现,那么紧跟其后存储的过程地址将被调用。每个过程使用EDX来装入不同字符串的偏移,然后在循环中显示该字符串。

 

看概念总是感觉比较复杂,其实非常简单,看一下代码就全明白了。

 

原代码如下:

 

TITLE Table of Procedure Offsets             (PorcTble.asm)

 

; This program contains a table with offsets of procedures.

; It uses the table to execute indirect procedure calls.

 

INCLUDE Irvine32.inc

.data

CaseTable BYTE 'A'                           ; look up value

                  DWORD Process_A         ; address of procedure

EntrySize = ( $ - CaseTable )

                  BYTE 'B'

                  DWORD Process_B

                  BYTE 'C'

                  DWORD Process_C

                  BYTE 'D'

                  DWORD Process_D

NumberOfEntries = 4

prompt BYTE "Press  capital A,B,C or D: ",0

 

msgA BYTE "Process_A",0

msgB BYTE "Process_B",0

msgC BYTE "Process_C",0

msgD BYTE "Process_D",0

 

.code

main PROC

          mov  edx,OFFSET prompt         ; ask user for input

          call WriteString

          call ReadChar                           ; read character into AL

          mov ebx,OFFSET CaseTable     ; point EBX to the table

          mov ecx,NumberOfEntries        ; loop count

L1:

          cmp al , [ebx]                           ; match found?

          jne L2                                       ; no: continue

          call NEAR PTR [ebx+1]              ; yes : call the procedure

 

         ; CALL指令调用存储在 EBX+1 内存地址处的过程地址,这种间接调用格式要求使用NEAR PTR运算符

 

          call WriteString                         ; display message

          call Crlf

          jmp L3                                      ; exit the search

L2:

          add ebx,EntrySize                    ; point to the next entry

          loop L1                                     ; repeat until ECX=0

L3:

          exit

main ENDP

 

;下面的每个过程将一个不同的字符串偏移送至EDX

Process_A PROC

           mov edx, OFFSET msgA

           ret

Process_A ENDP

Process_B PROC

           mov edx, OFFSET msgB

           ret

Process_B ENDP

Process_C PROC

           mov edx, OFFSET msgC

           ret

Process_C ENDP

Process_D PROC

           mov edx, OFFSET msgD

           ret

Process_D ENDP

END main

 

 

 

以上便是所有代码。下面来逐步分析。

 

首先是数据段,进行了一些变量的定义,比较难理解的有可能是

 

EntrySize = ( $ - CaseTable )

 

这句,其实这个是为了计算出每个单元(一个字符+一个函数)的长度,这样在A结束之后减去CaseTable的首地址,就得到了一个单元的地址大小。

 

下面看一下代码段。让我们将main作为一个整体看一下:

 

main PROC

          mov  edx,OFFSET prompt         ; 将要打印的提示用户输入的字符串移至edx寄存器,等待打印

          call WriteString                         ; 打印EDX中的内容

          call ReadChar                           ; 读取一个字符到AL寄存器中

          mov ebx,OFFSET CaseTable     ; 将EBX指向CaseTable首地址

          mov ecx,NumberOfEntries        ; 在ECX中保存要循环的值(这里为4)

L1:

          cmp al , [ebx]                           ; 将用户输入的保存在AL中的字符串与CaseTable中的字符进行比较

          jne L2                                       ; 如果不是,则跳转到L2

          call NEAR PTR [ebx+1]              ; 如果匹配,则会执行到这里,间接调用 EBX+1 地址处的过程

 

         ; CALL指令调用存储在 EBX+1 内存地址处的过程地址,这种间接调用格式要求使用NEAR PTR运算符

 

          call WriteString                         ; 打印EDX寄存器中的值

          call Crlf                                     ; 将光标移动到下一行开始

          jmp L3                                      ; 跳转到L3

L2:

          add ebx,EntrySize                    ; 将EBX指向下一个单元

          loop L1                                     ; 跳转到L1循环直到ECX=0

L3:

          exit

main ENDP

 

这便是代码最主要的部分,余下的这些:

 

Process_A PROC

           mov edx, OFFSET msgA

           ret

Process_A ENDP

Process_B PROC

           mov edx, OFFSET msgB

           ret

Process_B ENDP

Process_C PROC

           mov edx, OFFSET msgC

           ret

Process_C ENDP

Process_D PROC

           mov edx, OFFSET msgD

           ret

Process_D ENDP

 

 

只是将要打印的字符串送至EDX等待调用WriteString进行打印而已。

 

以上便是所有代码讲解。 

 

 

关于表格驱动分支选择,摘自原书:

 

表格驱动分支选择需要在初始化工作上有一些开销,但可以减少编写代码的数量。表格中可以包含大量的比较信息。而且这种方法比一系列很长的比较,跳转和调用指令的组合更加容易修改,表格甚至可以在运行时动态配置。

 

 

 

 

0
0
分享到:
评论

相关推荐

    微机原理与汇编语言课程设计

    1. **汇编语言编程**:学生需要用汇编语言编写程序,这涉及到指令集、寻址模式、控制流程结构(如循环和条件分支)以及I/O操作。他们需要熟悉特定的汇编语法,并能有效地使用汇编代码来控制硬件。 2. **数模转换(D...

    80X86汇编语言程序设计

    - **恰当地使用汇编语言**:适用于需要高性能或直接访问硬件资源的应用场景,如操作系统核心、设备驱动、嵌入式系统等。 **1.2 数据的表示和类型** - **数值数据的表示**: - **二进制表示**:最基础的数据表示...

    汇编语言设计实践:第5部分 基本汇编程序设计技术.ppt

    在汇编语言中,程序设计通常包括顺序、分支、循环和子程序等基本结构。 **1. 顺序程序设计** 顺序程序是指程序的执行顺序严格按照代码的排列顺序进行,不包含任何跳转或循环。例如,例5.2.1展示了计算表达式 `(3X+Y...

    Chapter6_新旧对比2

    程序员可以使用汇编语言直接控制硬件资源,这对于编写操作系统内核、设备驱动程序和性能关键的应用程序非常有用。 6.3 编程 编程是在特定架构上创建软件的过程,涉及到编写源代码,这通常是用高级编程语言(如C、...

    c语言考试题16参照.pdf

    4. 汇编程序:汇编语言源程序需要通过汇编程序进行翻译,生成目标程序,这个过程称为汇编。 5. 关闭应用程序快捷键:Alt+F4是Windows系统中关闭应用程序的常用快捷键。 6. 磁盘驱动器指示灯:当磁盘驱动器指示灯亮...

    Go高级编程

    讨论了如何使用接口和表格驱动的方法来编写可测试和可维护的代码。 **5.9 灰度发布和A/Btest** 介绍了灰度发布和A/B测试的概念及其在Go Web开发中的实践。 **5.10 补充说明** 总结了本章的关键点,并提供了...

    2022程序设计教程精选ppt.ppt

    面向过程的语言如Basic、Pascal、C、Fortran等,特点是程序由一系列指令和数据组成,数据与程序分离,并通过顺序、选择(分支)和循环三种基本结构组织。这些语言受到过程控制,有明确的开始和结束标志,可以表示为...

    c语言开发实例详解

    C语言是一种强大的、通用的编程语言,被广泛用于系统编程、软件开发、设备驱动编写以及各种嵌入式系统。它的语法简洁明了,适合初学者入门,同时也为高级程序员提供了极高的性能控制。"C语言开发实例详解"这套资料...

    2021-2022计算机二级等级考试试题及答案No.9468.docx

    16. 低级语言:汇编语言和机器语言是低级语言,因为它们更接近计算机硬件,但低级语言并不意味着可以直接被计算机识别执行,通常需要经过编译或解释,描述错误。 17. HTTP 端口:默认的 HTTP 端口号是 80,选项 C。...

    cn用户手册

    这部分内容概述了Cantata++支持的各种单元测试策略,例如白盒测试与黑盒测试的区别、隔离测试的重要性、全局变量检查、异常检测、C++测试用例的重用、基线测试的实施方法以及表格驱动测试等。 #### 关键技术详解 *...

    2022年统一考试计算机应用基础网考真题客观题部分及参考答案.doc

    汇编语言是介于机器语言和高级语言之间的语言,可以直接被计算机理解和执行,而高级语言更接近人类自然语言,编写更便捷,但需要编译或解释器转换为机器语言后才能运行。 综上所述,计算机应用基础涵盖了许多方面的...

    计算机系统结构复习题(含参考答案).pdf

    - **解析:**计算机使用的语言跨越不同的系统层次,包括但不限于高级语言、汇编语言、机器语言等,它们分别服务于不同的系统层次。 **22. 动态数据流机特点** - **选项分析:** - A. 数据流令牌无标号:不正确。 ...

    微机原理课程设计电动机正反转控制

    从提供的代码片段来看,这个课程设计采用了汇编语言进行编程,具体涉及到以下几个技术要点: 1. **栈段定义**:`STACKSEGMENT` 和 `STACKENDS` 定义了栈段,使用 `DW 64 DUP(?)` 分配了 64 个字的空间作为栈空间。...

    计算机专业术语收录计算机专业术语收录

    10. **Assembler(汇编器)**: 将汇编语言源代码转换为机器语言的软件工具,是连接高级编程语言和机器底层执行指令的桥梁。 11. **Automation(自动化)**: 利用技术和设备自动完成工作过程,减少人工干预,提高...

    计算机英语

    - **Assembler (汇编器)**:将汇编语言转换为机器码的程序工具。 - **Automation (自动化)**:通过软件或机械设备自动完成任务的过程。 #### 二、计算机硬件与存储 - **Band (带宽)**:数据传输速率的度量单位,...

    计算机常见英语词汇,IT方面必须掌握的词汇

    10. **Assembler / 汇编程序**: 将汇编语言转换为机器语言的软件工具。 11. **Automation / 自动化**: 使用技术来自动完成任务,减少人工干预。 12. **Band / 区**: 在磁带或磁盘存储中,指特定的存储区域。 13. ...

    课程设计简易计算器设计

    8、汇编语言程序源代码……………………………………………………………………………10 9 、结语………………………………………………………………………………………………17 10、设计实物图…………………………...

Global site tag (gtag.js) - Google Analytics