前言
数据段存在的意义是为了告诉cpu, 该段物理地址存放的是数据而不是指令
那么既然里面存放的是数据, 势必会有取值和赋值
取值
将20001H物理地址中的数据取值然后填入通用寄存器中, 如下:
1 | mov ax ,2000H |
以上有几个关键的地方需要记忆
- []内数字表示偏移地址, 默认将DS设为基地址
- 必须先声明段地址 也就是必须先给ds赋值
- 通用寄存器相当于临时变量ax,bx,cx,dx….. 任选 ,只要避免冲突即可
赋值
将BH中的数据赋值给数据物理地址20001H中, 如下:
1 | mov bh,30H |
和取值类似, 反过来即可
注意
- 在代码段CS:IP中, cpu读取的内存地址宽度是更具代码所占的字节数据而定, 那么在数据段DS中,如何确定读取多少个字节的数据呢?
以取值代码为例:
1 | mov ax ,2000H |
如果物理地址和数据一一对应关系如下:
1 | 20001H----->23 |
那么ax中的值是多少呢?
答案是1123 而不是23, 为什么?
这是根据寄存器容器大小决定的, 容器大装得多, 容器小装的小, 因为ax是16位容器,那么则获取16位也就是两个字节的数据,即1123, 如果是ah或者al接收的话则获取8位也就是一个字节的数据,即23
- mov 内存单元:内存单元是不允许的, 比如mov [0],[1]