- 浏览: 110357 次
- 性别:
- 来自: Mars
文章分类
最新评论
-
a376730551:
红色部分表示 把进位值传递给bh
汇编语言AAA指令多字节加法代码分析(5) -
madbluesky:
死了,只剩下赞扬了...看来不只是中国,全世界都是同一套啊.. ...
麦克杰克逊--------世界上最傻的明星 -
sunloveny:
敬你!
麦克杰克逊--------世界上最傻的明星 -
jiorry:
感动
MJ 一路走好
麦克杰克逊--------世界上最傻的明星 -
javaboy2006:
MJ单纯到不懂得保护自己。永远怀念。
麦克杰克逊--------世界上最傻的明星
来自于《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进行打印而已。
以上便是所有代码讲解。
关于表格驱动分支选择,摘自原书:
表格驱动分支选择需要在初始化工作上有一些开销,但可以减少编写代码的数量。表格中可以包含大量的比较信息。而且这种方法比一系列很长的比较,跳转和调用指令的组合更加容易修改,表格甚至可以在运行时动态配置。
发表评论
-
IA-32处理器内存管理学习总结?
2009-10-23 14:58 1377内容来自于《Intel汇 ... -
汇编语言秒表程序代码分析(21)
2009-10-23 10:40 2306本文代码来自于《Intel汇编语言程序设计》 (第四版) ... -
汇编语言GetDateTime代码分析(20)
2009-10-23 10:14 1826本文代码来自于 ... -
汇编语言计时器代码分析(19)
2009-10-23 09:45 2216来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言写文件读文件代码分析(18)
2009-10-22 16:37 2628内容来自于《Intel汇编语言程序设计》(第 ... -
汇编语言32位控制台读取用户输入字符程序代码分析(17)
2009-10-22 15:00 4148来自于《Intel汇编语言程序设计》(第四版)第1 ... -
汇编语言循环遍历链表代码分析(16)
2009-10-22 11:28 1843来自于《Intel汇编语言程序设计》(第四版)第10章- ... -
汇编语言醉汉走路代码分析(15)
2009-10-22 10:50 1356来自于《Intel汇编语言 ... -
汇编语言显示系统时间代码分析(14)
2009-10-21 15:18 2187代码来自于《Intel汇编语言程序设计》(第四版)第10 ... -
汇编语言二分查找排序代码分析(13)
2009-10-21 09:52 1921来自于《Intel汇编语 ... -
汇编语言冒泡排序算法代码分析(12)
2009-10-20 16:52 4218来自于《Intel汇编 ... -
汇编语言裁剪字符串代码分析(11)?
2009-10-20 15:27 1361来自于《Intel汇编语言程序设计》(第四版 ... -
汇编语言求字符串长度代码分析(10)
2009-10-20 11:05 2226来自于《Intel汇编语言程序设计》(第四版)第八 ... -
汇编语言数组乘法代码分析(9)
2009-10-20 10:07 1592来自于《Intel汇编语言程序设计》(第四版)第八章,主 ... -
汇编语言实现递归阶乘算法代码分析(8)
2009-10-20 08:49 3729来自于《Intel汇编语言程序设计》(第四版)第八 ... -
《Intel汇编语言程序设计》第四版勘误
2009-10-19 16:14 1032215页: mov BYTE PTR [e ... -
汇编语言16位随机整数填充数组代码分析(7)
2009-10-19 14:55 1449来自于《Intel汇编语言》(第四版)第八章的一段 ... -
汇编语言值传递和引用传递代码分析(6)
2009-10-19 09:40 1224来自于《Intel汇编语言程序设计》(第四版)的第 ... -
汇编语言AAA指令多字节加法代码分析(5)
2009-10-18 10:44 4411来自于《Intel汇编语言程序设计》(第五版)第七章的代 ... -
汇编语言数组中查找正数代码分析(3)
2009-10-15 16:54 1350《Intel汇编语言程序 ...
相关推荐
1. **汇编语言编程**:学生需要用汇编语言编写程序,这涉及到指令集、寻址模式、控制流程结构(如循环和条件分支)以及I/O操作。他们需要熟悉特定的汇编语法,并能有效地使用汇编代码来控制硬件。 2. **数模转换(D...
- **恰当地使用汇编语言**:适用于需要高性能或直接访问硬件资源的应用场景,如操作系统核心、设备驱动、嵌入式系统等。 **1.2 数据的表示和类型** - **数值数据的表示**: - **二进制表示**:最基础的数据表示...
在汇编语言中,程序设计通常包括顺序、分支、循环和子程序等基本结构。 **1. 顺序程序设计** 顺序程序是指程序的执行顺序严格按照代码的排列顺序进行,不包含任何跳转或循环。例如,例5.2.1展示了计算表达式 `(3X+Y...
程序员可以使用汇编语言直接控制硬件资源,这对于编写操作系统内核、设备驱动程序和性能关键的应用程序非常有用。 6.3 编程 编程是在特定架构上创建软件的过程,涉及到编写源代码,这通常是用高级编程语言(如C、...
4. 汇编程序:汇编语言源程序需要通过汇编程序进行翻译,生成目标程序,这个过程称为汇编。 5. 关闭应用程序快捷键:Alt+F4是Windows系统中关闭应用程序的常用快捷键。 6. 磁盘驱动器指示灯:当磁盘驱动器指示灯亮...
讨论了如何使用接口和表格驱动的方法来编写可测试和可维护的代码。 **5.9 灰度发布和A/Btest** 介绍了灰度发布和A/B测试的概念及其在Go Web开发中的实践。 **5.10 补充说明** 总结了本章的关键点,并提供了...
面向过程的语言如Basic、Pascal、C、Fortran等,特点是程序由一系列指令和数据组成,数据与程序分离,并通过顺序、选择(分支)和循环三种基本结构组织。这些语言受到过程控制,有明确的开始和结束标志,可以表示为...
C语言是一种强大的、通用的编程语言,被广泛用于系统编程、软件开发、设备驱动编写以及各种嵌入式系统。它的语法简洁明了,适合初学者入门,同时也为高级程序员提供了极高的性能控制。"C语言开发实例详解"这套资料...
16. 低级语言:汇编语言和机器语言是低级语言,因为它们更接近计算机硬件,但低级语言并不意味着可以直接被计算机识别执行,通常需要经过编译或解释,描述错误。 17. HTTP 端口:默认的 HTTP 端口号是 80,选项 C。...
这部分内容概述了Cantata++支持的各种单元测试策略,例如白盒测试与黑盒测试的区别、隔离测试的重要性、全局变量检查、异常检测、C++测试用例的重用、基线测试的实施方法以及表格驱动测试等。 #### 关键技术详解 *...
汇编语言是介于机器语言和高级语言之间的语言,可以直接被计算机理解和执行,而高级语言更接近人类自然语言,编写更便捷,但需要编译或解释器转换为机器语言后才能运行。 综上所述,计算机应用基础涵盖了许多方面的...
- **解析:**计算机使用的语言跨越不同的系统层次,包括但不限于高级语言、汇编语言、机器语言等,它们分别服务于不同的系统层次。 **22. 动态数据流机特点** - **选项分析:** - A. 数据流令牌无标号:不正确。 ...
从提供的代码片段来看,这个课程设计采用了汇编语言进行编程,具体涉及到以下几个技术要点: 1. **栈段定义**:`STACKSEGMENT` 和 `STACKENDS` 定义了栈段,使用 `DW 64 DUP(?)` 分配了 64 个字的空间作为栈空间。...
10. **Assembler(汇编器)**: 将汇编语言源代码转换为机器语言的软件工具,是连接高级编程语言和机器底层执行指令的桥梁。 11. **Automation(自动化)**: 利用技术和设备自动完成工作过程,减少人工干预,提高...
- **Assembler (汇编器)**:将汇编语言转换为机器码的程序工具。 - **Automation (自动化)**:通过软件或机械设备自动完成任务的过程。 #### 二、计算机硬件与存储 - **Band (带宽)**:数据传输速率的度量单位,...
10. **Assembler / 汇编程序**: 将汇编语言转换为机器语言的软件工具。 11. **Automation / 自动化**: 使用技术来自动完成任务,减少人工干预。 12. **Band / 区**: 在磁带或磁盘存储中,指特定的存储区域。 13. ...
8、汇编语言程序源代码……………………………………………………………………………10 9 、结语………………………………………………………………………………………………17 10、设计实物图…………………………...