本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
学习教材:《汇编语言(第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 |
此方法结构清晰便于扩充