小白的汇编之路(三) ----寄存器访问

小白的汇编之路(三) ----寄存器访问

前言

上回我们学会了怎么对寄存器进行赋值,而在汇编程序中,对寄存器的访问,对内存单元的访问必不可少。在开始之前,不妨想一个问题:
一个程序,涉及到的数据数量可能不在少数,那我们怎么存储它们?全存进那十几个寄存器中?如果是几十个数据,寄存器够存么?那我们该把这些数据存到哪里去?
本文是第三章的第一部分

内存中字的存储

首先,我们得明白对于内存存储,每个内存单元是一个字节(一个单元存储一个字节
如下图(左边代表第几个内存单元,右边代表内存单元存储的值;内存中只有右边的表格,左边的表格是方便理解的):
例如第0个内存单元存储的值为20H

0 20H
1 4EH
2 12H
3 34H
4 5FH
5 23H

图1

字单元与字节单元

在汇编中,1字=2字节(1W=2B)
例如:第0个字单元就是由第0,1字节单元组成
那第1个字单元呢?当然是由第1,2字节单元组成
之后的以此类推。
那如果我们要存储408EH到第0个字单元中。内存会怎么变化呢?、

单元编号 存储前 存储后
0 20H 8EH
1 4EH 40H
2 12H 12H
3 34H 34H
4 5FH 5FH
5 23H 23H

图2
对于408EH,其中的高位字节为:40H;低位字节为:8EH。
内存存储用高位地址存储字型数据的高位字节,低位地址存储字型数据的低位字节!
所以存储后的内存示意图才会那般变化。

DS与[address]

我们在之前提及过CS寄存器,这回我们会涉及到DSSS两个寄存器,
我们在之前涉及过段的概念。
而在汇编中,有这样的几种段:数据段(DS),代码段(CS),堆栈段(SS),附加段(ES)
数据段(Data segment):用来存储数据的段
代码段(Code segment):用来存放代码的段
堆栈段(Stack segment):是一个栈,使用时需要用到SS与SP两个寄存器
附加段(Extra segment)暂时不理会。

当我们需要对内存进行访问时,需要通过段地址与偏移地址来进行寻址;
对于代码段,我们将段地址存入CS寄存器中,偏移地址借助IP寄存器;
对于数据段,我们将段地址存入DS寄存器中,偏移地址借助IP寄存器;
对于堆栈段(以下简称栈),我们将段地址存入SS寄存器,偏移地址存入SP寄存器中。

例如有这样一段内存单元:

0 20H
1 4EH
2 12H
3 34H
4 5FH
5 23H

图3
以下用DS代表DS寄存器,其他同理。

假设我们要编写一段程序将408EH存入第1个字单元中,该怎么编写?
且第0个字节单位的地址为 00000H
那么我们怎么将对应的值赋给DS?

  1. 我们已经学过:物理地址=段地址*16+偏移地址 所以有:DS存入0000H
    mov ds,0000H
    这样就能将DS指向我们需要的段了,但程序这样编写对吗?
    8086CPU不支持直接将数据存入段寄存器中,所以我们要借助其他寄存器进行间接存储。
    正确的应该是:
    mov ax,0000H
    mov ds,ax

    这样我们就能获取指定的段了
  2. 既然获得指定的段了,那我们怎么针对段内某一个内存单元进行赋值?
    我们可以借助[address]进行指定内存单元的赋值,但这一点的前提是建立在DS已指定好是哪个段了。
    [address]表示一个偏移地址为address的内存单元。 依旧是以此图为例
    0 20H
    1 4EH
    2 12H
    3 34H
    4 5FH
    5 23H
    图3
    借助[address]进行指定的话,假设有这样的一段程序:
    mov ax,0000H
    mov ax,[0]
    那么就是说将第0个字单元存入AX寄存器中,此时AX寄存器的值为:4E20H
    mov ax,0000H
    mov al,[0]
    将第0个字节单元存入AL寄存器中,此时AX寄存器的值为:0020H
    那么问题就来了,同样是[0],为何两次存值,第一次是字单元的赋值,而第二次是字节单元的赋值? 答案就在于存值的寄存器:
    第一次的AX是一个16位寄存器,所以用[0]进行赋值的话,CPU是将第0个字单元的值存入ax寄存器中
    第二次的AL是一个8位的寄存器,所以用[0]进行赋值的话,CPU是将第0个字节单元的值存入al寄存器中
    所以我们可以借助[address]将408EH存入第1个字单元中:
    mov bx,408EH
    mov [0],bx

mov sub add 等指令的常用形式

mov:
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器

sub
sub 寄存器,数据
sub 寄存器,寄存器
sub 寄存器,内存单元
sub 内存单元,寄存器

add
add 寄存器,数据
add 寄存器,寄存器
add 寄存器,内存单元
add 内存单元,寄存器

发布了10 篇原创文章 · 获赞 3 · 访问量 326

猜你喜欢

转载自blog.csdn.net/weixin_41043607/article/details/103920206