目录
  1. 1. 寄存器
    1. 1.1. 通用寄存器
    2. 1.2. 字在寄存器中的存储
    3. 1.3. mov和add汇编指令
    4. 1.4. 检测点2.1:
    5. 1.5. 物理地址
    6. 1.6. 段地址*16+偏移地址=物理地址的本质含义
    7. 1.7. 检测点2.2
    8. 1.8. CS和IP
    9. 1.9. 问题2.3
    10. 1.10. 检测点
寄存器

寄存器

  • 一个典型的CPU有运算器、控制器、寄存器等器件构成
  • 寄存器是CPU中程序员可以用执行读写的部件。程序员通过改变各种寄存器中的内容来实现对CPU的控制
  • 不同的CPU,寄存器的个数、结构是不同的。8086CPU有14个寄存器,每个寄存器有一个名称。这些寄存器是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PWS、

通用寄存器

  • 8086CPU的的所有寄存器都是16位的,可以存放两个字节,AX、BX、CX、DX、这四个寄存器位通用寄存器
  • 一个16位的寄存器可以存储一个16位的数据,所能存储的数据最大值为2^16-1,或用16进制表示为FFFFH,也为10000H-1
  • AX的低8位构成了AL寄存器,高8位构成了AH寄存器,AH和AL寄存器是可以独立使用的

字在寄存器中的存储

  • 一个16位的寄存器可以存放两个字节(byte),即为一个字(word),一个字等于两个字节
  • 而计算机的存储单元为字节(byte),一个内存(存储)单元可以存放8位数据(bit),也就是说,计算机中的数据大多是由1~N个8位数据构成。
  • 很多时候,用16进制表示数据可以直观的看出数据是由哪些8位数据构成,如2000写成4E20,可以看出是由4E和20两个8位数据构成的,如果AX中存放4E20H,则AH里是4E,AL里是20

    mov和add汇编指令

    原AX,BX中的值:0000H,0000H


    问题2.1
    在执行前ax和bx中的数据都为8226H,相加后所得值为:1044CH,但ax为16位寄存器,只能存放4位十六进制的数据,所以最高位的1不能在ax中保存,,ax中的数据为:044CH

    问题2.2
    在执行前,al中的数据为C5H,相加后所得的值为:158H,但是al为8位寄存器,只能诚邀您放两位16精致的数据,所以最高位的1丢失,ax中的数据为:0058H

    检测点2.1:

(1)写出每条汇编指令执行后相关寄存器中的值。

mov ax,62627 AX= F4A3H

mov ah,31H AX=31A3H

mov al,23H AX=3123H

add ax,ax AX=6246H

mov bx,826CH BX=826CH

mov cx,ax CX=6246H

mov ax,bx AX=826CH

add ax,bx AX=04D8H

mov al,bh AX=0482H

mov ah,bl AX=6C82H

add ah,ah AX=D882H

add al,6 AX=D888H

add al,al AX=D810H

mov ax,cx AX=6246H

(2)只能使用目前学过的汇编指令,最多使用4条指令,计算2的4次方.

mov ax,2h

add ax,ax

add ax,ax

add ax,ax

物理地址


段地址*16+偏移地址=物理地址的本质含义

CPU在访问内存时,用一个基础地址(段地址*16)和一个相对于基础地址的偏移地址相加,给出内存单元的物理地址

检测点2.2

(1)给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为多少到多少?

答:物理地址=SA*16+EA

EA的变化范围为0H~FFFFH

物理地址范围为(SA16+0H)~(SA16+FFFFH)

现在SA=0001H,那么寻址范围为

(0001H16+0H)~(0001H16+FFFFH)=00010H~1000FH

(2)有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元。则SA应满足的条件是:最小为多少?最大为多少?

答:

 物理地址 20000H = SA * 10H + 偏移地址

 显然,偏移地址应该取最大值,SA 才能达到最小。

 那么,偏移地址取最大值:FFFFH,行吗?

 代入上述方程,发现,两边的,最末位,不相等。

偏移地址最大值,只能取到:FFF0H,方程才有可能成立。

 按照公式:

 物理地址 = SA * 10H + 偏移地址

 可知,物理地址、偏移地址,两者的最低位,必定是相同的。

 当物理地址=20000H,偏移地址也只能是:XXX0H,取最大就是 FFF0H。

于是:SA = (20000H - FFF0H) / 16=10010H / 16 = 1001H。

标记:王爽汇编语言,段地址*16+偏移地址=物理地址,其中16是十进制。

提示,反过来思考一下,当段地址给定为多少,CPU无论怎么变化偏移地址都无法寻到20000H单元?

答:

 先求出,段地址为多少的时候,变化偏移地址可找到20000H地址单元。

 段地址 × 16 + 偏移地址 = 20000H

 偏移地址=0000H,段地址则为 2000H;

 偏移地址=FFF0H,段地址则为 1001H。

 那么,当段地址大于 2000H,或小于 1001H,就不能找到 20000H。

CS和IP

CS和IP是8086CPU中最为关键的寄存器,CS为代码段寄存器(存放段地址),IP为指令指针寄存器(存放偏移地址)

1、 汇编指令由操作码和操作数组成 如:mov ax,0
mov为操作数 表示指令的功能(是传送指令)
ax,0是2个操作数 即0(0000H)为源操作数 ax为目的操作数
该指令就是 将源操作数传送给目的操作数 从ax可以看出是一条16位的传送指令
2、 mov ax,0在内存中的机器指令是B8 00 00
B8 是操作码 表示是一条以ax为目的操作数的传送指令(操作数ax为寄存器寻址 隐含在操作码 中,00 00 表示的是一个16位的立即数即0000H 低8位在前 高8位在后。
3、汇编指令在内存中 就是以B8 00 00机器指令表示的二进制代码。

问题2.3



检测点

下面的3条指令执行后,cpu几次修改IP?都是在什么时候?最后IP中的值是多少?

mov ax,bx       
sub ax,ax  
jmp ax 

注:mov ax,bx (高级编程语言就是ax=bx )
sub ax,ax (高级编程语言就是ax=ax-ax 发现ax=0H)
jmp ax (偏移增量为ax,进而IP=IP+ax,即加上索引的字节数)

一共修改四次
第一次:读取mov ax,bx之后
第二次:读取sub ax,ax之后
第三次:读取jmp ax之后
第四次:执行jmp ax修改IP
最后IP的值为0000H,因为最后ax中的值为0000H,所以IP中的值也为0000H

文章作者: nocbtm
文章链接: https://nocbtm.github.io/2018/09/07/寄存器/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 nocbtm's Blog
打赏
  • 微信
  • 支付宝