8086CPU汇编:一般的标号与直接定址标号

注:下面程序所用的“:”,“,”标号为中文标号,实际上应该是英文的符号
一、一般的标号
我们先来分析一下下面这段代码
assume cs:code
……

code segment

s:
代码0……
code ends
end s

此处标号s代表代码0存放的起始偏移地址

end s代表着整个程序指令的开始位置,也就是end s中的s代表着指令将会从s标号处开始执行,这就意味着代码段与数据段在CPU看来实质上是没有区别的,都是0、1的机器代码罢了,CPU是通过end s来确认指令开始的位置

可s仅仅是一个偏移地址,它默认的段地址是什么呢?
观察程序的第一行发现cs:code,其实它的意思就是在code段中偏移地址的缺省段地址为cs,换句话说就是,如果在code段中缺少段地址就默认为cs

举个例子
assume cs:code
……
data segment

d:
数据0……
data ends
……

code segment

s:
代码0……
code ends
end s
这段程序中,我们没有给data段指定缺省段寄地址,那么对于data段中的标号d就无法单独引用,需要指定段地址
如需给data段设置缺省段地址则需在程序的第一行指定,如下
assume cs:code,ds:data
……
data segment

d:
数据0……
data ends
……

code segment

s:
代码0……
code ends
end s
像这样我们就能在整个程序引用标号d

总结:
如果需要引用标号后的数据,则需给它指定段地址或者设置缺省段地址(缺省段地址在assume后指定)

二、直接定址标号
还有一种标号如下
assume cs:code
……

code segment

d db 数据0……

s:
代码0……
code ends
end s

标号d后面没有“:”,但是多了一个伪指令db,这里的意思是d后的每一个数据占用一个字节内存单元(db意味着强制转换为一个字节,若db换为dw则每一个数据占用两个字节,dd同理)
可见这里的标号d不仅包含了数据0的偏移地址,还包含了数据0中每一个数据占用的内存单元大小
于是有
mov ax,d 等价于 mov ax,cs:[d]
inc d 等价于 inc db ptr cd :[0]
这里看到d自增1,相当于自增一个字节的偏移(db换做dw、dd同理效果)

原理:
d = d[0]
inc d = d[1]
d[bx+si+di]=[d+bx+si+di]
d[bx+si+di]就相当于自增了bx+si+di,d[bx+si+di]也就代表从d开始的第bx+si+di个数据,有点c语言数组那味儿了

如图

既然d不加“:”可以这么用,那么d加“:”呢
d不加“:”但有一层隐含意思:d后面的每个数据占用内存固定,所以能够很轻松的得到d后第x个数据的位置:d+x*每个数据占用的字节大小
而d加“:”后面的每一个数据占用内存大小不定,所以不能用

总结:
d加“:”只代表偏移地址
d不加标号不仅代表偏移地址还表示着后面的每一个数据大小固定

数据段一般每个数据大小固定,适合用d不加“:”,且便于访问
代码段每个数据大小一般不同,所以d加“:”常用于代码段
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值