学汇编,记笔记(十五)《汇编语言》王爽著——直接定址表

114 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

学习教材:《汇编语言(第4版)》王爽著 此笔记是书中内容+自我总结,方便查阅和复习 请支持原著

一、描述单元长度的标号

示例代码片段:

data segment
	a db 1,2,3,4,5,6,7,8
	b dw 0
data ends

此时:a代表了之后的第一个单元(cs:[0]),b代表了之后的第一个单元(cs:[8])

对于b可以执行以下操作:

mov ax,b
mov b,2
inc b

对于a:

mov al,a[bx+si+i]
;等效于mov al,cs:0[bx+si+3] 
;即cs:0[bx+si+3+0]

检测点16.1

补全程序,累加a处8个数据存到b处

assume cs:code

code segment
	a dw 1,2,3,4,5,6,7,8
	b dd 0
	
start:
	mov si,0
	mov cx,8
	
s:
	mov ax,a[si] ;a定位到cs:[0],si是偏移量每次加2B
	add word ptr b[0],ax ;b是双字,取低位地址累加单字
	adc word ptr b[2],0 ;取高位地址存进位
	add si,2
	loop s

	mov ax,4c00h
	int 21h
	
code ends
end start

二、在其他段使用标号

简而言之,在code段可以调用data段的标号,当且仅当标号后没有英文分号、且data段必须在assume中有声明,即:

;条件一
assume cs:code,ds:data
;条件二
	a db 1 ;  a:则不行 
...
	add a,1 ;合法!
...

Ⅰ、标号嵌套——字型

标号还可以嵌套:

	a db 1,2,3
	b dw 0
	c dw a,b

此时c等效于:

	c dw offset a,offset b

此处存储的是字型偏移地址,c的内容实质是地址,与嵌套源的没有关系

Ⅱ、标号嵌套——双字型

	a db 1,2,3
	b dw 0
	c dd a,b

此时c等效于:

	c dd offset a,seg a,offset b,seg b

此处存储的是双字型段地址:偏移地址,seg x用于取标号所在段地址

三、直接定址表

数值和字符的映射表使用了8421BCD码,将字符和数字序号一一对应

	table db '0123456789ABCDEF'
数值字符
table[0]0
table[1]1
......
table[15]F

通过依据数据直接计算出要找的元素的位置的表叫直接定址表,查表即可得到结果

四、程序入口地址的直接定址表

将子程序的入口地址存在表中,根据所选功能号执行

	table dw sub1,sub2,sub3
功能子程序
table[0]子程序1
table[1]子程序2
table[2]子程序3

此方法结构清晰便于扩充