汇编网首页登录博客注册
stop1204的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
最新评论
最新留言
文章收藏

[2013-04-30 10:28] 第二章笔记  大家请将内容复制到记事本,txt格式的, 然后将宽拉到855以上即可

典型的CPU由运算器\控制器\寄存器等器件构成,主要靠内部总线相连,外部总线实现CPU与主板上其他器件的联系.
CPU中:                ***        运算器进行信息处理
                ***        寄存器进行信息存储
                ***        控制器控制各种器件进行工作
                ***        内部总线连接各种器件,在它们之间进行数据的传送
对汇编程序员来说,CPU主要部件是寄存器,可以用指令读写的部件,通过改变寄存器中的内容实现对CPU的控制;
不同的CPU,寄存器的个数\结构是不相同的,8086CPU有14个寄存器,每个寄存器都有一个名称.
____________________________________________________________________________________________________

通用寄存器:__________        8086CPU的所有寄存器都是16位,可以存放两个字节.
                        AX\BX\CX\DX 四个寄存器通常用来存放一般性的数据,被称为|通用寄存器|.
                寄存器逻辑结构图:                     |AX|
                        {15 14 13 12 11 10 9 8                 7 6 5 4 3 2 1 0}编号
                        □ □ □ □ □ □ □ □                □□□□□□□□        二进制数据
        AX\BX\CX\DX        四个寄存器都可以分为两个可独立使用的8位寄存器来用.原因为兼容上一代CPU.
                AX可分: AH 和 AL        BX分: BH BL        CX分: CH CL        DX分: DH DL
                数据:        18        二进制表示: 10010        在16位寄存器AX中存储:
                                                     |AX|
                        {15 14 13 12 11 10 9 8                 7 6 5 4 3 2 1 0}编号
                        □ □ □ □ □ □ □ □                □□□ 1 0 0 1 0        二进制数据
                8086CPU16位寄存器分为两个8位寄存器的情况:
                                                     |AX|
                        {15 14 13 12 11 10 9 8                 7 6 5 4 3 2 1 0}编号
                        □ □ □ □ □ □ □ □                □□□□□□□□        二进制数据
                        {7  6  5  4  3  2  1  0                7 6 5 4 3 2 1 0}编号
                                |AH|                                |AL|
                        **AX的低8位构成AL寄存器,高8位构成AH寄存器,AH与AL是可以独立使用的8位寄存器.
        AX中数据 10011100 00100000 数据是"20000",AH:10011100 AL:00100000 也可以看成独立数据"78和32".
        ******十六进制数的一位相当于二进制数的四位:0100 1110 0010 0000可以表示:4 E 2 0四位十六进制数
        一个内存单元可存8位数据,CPU的寄存器又可放N个8位数据,就是说计算机的数据大多由1-N个8位数据组成

几条汇编指令:__________        汇编指令不区分大小写        (高级语言会区分,如变量名)        " ax = ahalH "
                mov ax,18        将18送入寄存器 AX        AX = 18
                add ax,8        将寄存器AX中的数值加上8                AX=AX+8
                mov ax,bx        将寄存器BX中的数据送入寄存器AX        AX=BX
                add ax,bx        将ax和bx中数值相加,结果存AX        AX=AX+BX
        ***        Add ax,bx 两者数据都为8226H,ax+bx=1044CH,但ax是16位寄存器,只能存放4位十六进制数据,
                        所以最高位的1不能在ax中保存,ax中的数据为:        044CH
        ***        Add al,93H        AL=158H,但al是8位寄存器,只能放两位十六进制数据,所以最高的1丢失,所以
                AL中的数据为0058H(这里的丢失指进位值不能在8位寄存器中保存,但CPU并不是丢弃它)
                AL现作为独立的寄存器来用,和AH无关,所以AL的进位值不会存储在AH中,它进行的是8位运算
                ADD AX,93H 进行的是16位运算,低8位进位会存储在AH中.
        *****        进行数据传送或运算时,指令操作对象位数必须一致,如:
                mov ax,bx        add ah,bl        mov ax,18H(或0018H或24或11000B)        
                错误的: mov al,bx        mov al,100H        add al,20000(20000超出8位数据)
        ___________________________________________________________________________________
                mov ax,62627 AX=62627        mov ah,31H AX=3100H        mov al,23H AL=23H
                add ax,ax    AX=6246H        mov bx,826cH BX=826cH        mov cx,ax  CX=6246H
                add ax,bx    AX=826cH        add ax,bx  AX=04d8H        mov al,bh  AX=d882H
                mov ah,bl    AX=046cH        add ah,ah  AX=086cH        add al,6   AX=0872H
                add al,al    AX=08e4H        mov ax,cx  AX=6246H
        计算2的4次方:        mov ax,2        add ax,ax        add ax,ax        add ax,ax
        ___________________________________________________________________________________
物理地址:__________        CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址.
                CPU访问内存单元时必须给出内存单元的地址.所有内存单元构成的存储空间是一个一维的线性空
                        间,每个内存单元在这空间中都有唯一的地址这个唯一的地址称为        "物理地址".
                CPU向总线上发出物理地址前,必须在内部先形成这个物理地址,不同CPU有不同形成物理地址方式

16位结构的CPU:__________        8086CPU,8086是16位机,8086是16位结构的CPU.
                特性:(1)运算器一次最多可以处理16位的数据;        (2)寄存器的最大宽度为16位;
                                (3)寄存器和运算器之间的通路为16位.
                内存单元地址送上地址总线前,必须在CPU中处理\传输\暂存,能一次性处理\传输\暂存16位地址

8086CPU给出物理地址的方法:__________        8086CPU采用在内部用两个16位地址合成方法形成一个20位物理地址
                8086CPU有20位地址总线,可传20位地址,达到1MB寻址能力;它又是16位结构,一次处理地址为16位
                从内部结构看,如果将地址从内部简单发出,那么只能送出16位地址,表现出的寻址能力只有64KB.
        **        (16位)段地址------→---|地址加法器                →|---20位地址总线(物理地址)→|
        **        (16位)偏移地址----→---|____↓____                →|---数据总线                →|        内存
                                物理地址(20位)        |→输入输出控制电路→|---控制总线        →|
        ***        8086CPU读写内存时:
                        (1)CPU相关部件提供两个16位地址,一个称为段地址,另一个称为偏移地址;
                        (2)两个地址通过内部总线送入一个称为地址加法器的部件;
                        (3)地址加法器将两个16位地址合成为一个20位的物理地址;
                        (4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
                        (5)输入输出控制电路将20位物理地址送上地址总线;
                        (6)20位物理地址被地址总线传送到存储器.
                地址加法器采用        [物理地址=段地址×16+偏移地址]方法合成物理地址.
                段:1230H   偏移:00C8H        加法器:1230+00C8 段地址×16 = 12300+00C8 = 123C8 (物理地址)
                        16是十进制的16,所以需转换成16进制=10H 1230H×10H=12300H
        ***********左移运算:        左移位数        二进制                十六进制        十进制
                                   0                10B                2H                2
                                   1                100B                4H                4
                                   2                1000B                8H                8
        **以 3 次一轮回                   3                10000B                10H                16
                                   4                100000B                20H                32
                (1)一个数据的二进制形式左移 1 位,相当于该数据乘以 2 ;
                (2)一个数据的二进制形式左移 N 位,相当于该数据乘以 2 的 N 次方;
                (3)地址加法器完成段地址×16的运算就是将二进制形式存放的段地址左移 4 位.
        ***********        一个X进制的数据左移 1 位,相当于乘以 X.

"段地址×16+偏移地址=物理地址"的本质含义:__________        基础地址+偏移地址=物理地址
                基础地址(段地址×16) + 相对于基础地址的偏移地址 = 给出内存单元的物理地址.
        **        内存中并没有分段,8086CPU的合成方式给出的物理地址使我们可以分段方式管理内存.如:
                100H---1FFH 的内存单元组成一个段,段起始地址(基础地址)为100H,段地址为10H,大小为10H;
                编程时根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础)
                        用偏移定位段中的内存单元.
        *****        (1)段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
                (2)偏移地址为16位,16位地址的寻址能力为64KB,所以一个段的长度最大为64KB
____________________________________________________________________________________________________
        CPU访问内存单元时必须向内存提供内存单元的物理地址.
        8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址.
        CPU可以用不同段地址和偏移地址形成同一个物理地址,如:访问5H单元,可以用段2H+偏3H 或者 段1H+偏4H
***        给定一个段地址,仅通过变化偏移地址来寻址,最多可定位多少个内存单元?
                偏移地址16位,可变化0-FFFFH(0-65535),就是说偏移来寻最多可寻64KB个内存单元;
                给定段地址100H,偏移寻址: CPU寻址范围(偏移范围):1000H--1FFFH 因为:段×16H+偏移
********根据需要,将地址连续、起始地址为16的倍数的一组内存单元定义为一个段.(1H就不行,10H可以,11H不行)
                (1)给定段地址为0001H,通过变化偏移地址寻址,CPU寻址范围为 "10H" 到 "1FH" .
                (2)一数字存放在内存20000H单元中,给定段地址SA,若要用偏移地址寻到该单元,
        ***                SA需满足条件:最小 "1001H" 最大 "2000H" .
                EAmax:SAmin=2000h-ffffh/16=1001h        EAmin:SAmax=2000h-0h/16=2000h
____________________________________________________________________________________________________

段寄存器:__________        8086有4个段寄存器:SD\DS\SS\ES,CPU访问内存由4个段寄存器提供内存单元的段地址.

CS 和 IP:__________        8086机中任意时刻,CPU将CS:IP指向的内容当作指令执行.
                CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址.
        ***        CS为代码段寄存器,IP为指令指针寄存器.
        ***在8086PC机中任意时刻,设CS中内容为M,IP中内容为N,8086CPU从内存M×16|N单元开始读取指令并执行
        8086CPU读取\执行指令工作原理:                             内存                汇编指令
                        CPU                                     |B8|20000|
                AX□        |CS[2000]→|地址加法器|                     |23|20001|        }        Mov ax,0123H
                BX□        |IP[0000]→|        ↓    |                     |01|20002|________________________
                 ̄ ̄ ̄ ̄|指令缓冲器←| ̄ ̄ ̄ ̄                     |BB|20003|
                其他部件|    ↓             |输入输出|→20位地址总线|03|20004|        }        mov bx,0003H
                _________执行控制器  |控制电路|         数据总线  ←|00|20005|
                (1)8086CPU当前状态:CS中内容为2000H,IP中的内容为0000H;
                (2)内存20000H--20009H单元存放着可执行的机器码;
                (3)内存20000H--20009H单元中存放的机器码对应的汇编指令如下:
                        地址:20000H-20009H,内容B8\23\01,长度3 Byte,对应汇编指令Mov ax,0123H……
        *        CPU从内存CS:IP(2000H×16+0000H)处读取指令执行→CS\IP中内容送入地址加法器→送入控制电                        路→控制电路将物理地址20000H送上地址总线→从内存20000H单元开始存放的机器指令                                B8\23\01通过数据总线被送入CPU→控制电路将机器指令B8\23\01送入指令缓冲器→读取一条指                        令后IP中的值自动增加,使CPU可以读取下一条指令 (因读入的指令B8\23\01长度为3字节,所以IP                        中的值增加3),此时CS:IP指向内存单元2000:0003→执行控制器执行指令B8\23\01
                (即mox ax,0123H),指令之后后AX中内容为0123H→此时,CPU将容内存单元2000:2003处读取指令.
        ***        (1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
                (2)IP=IP+所读取指令的长度,从而指向吓一跳指令;
                (3)执行指令,转到第一步重复这个过程.
                8086CPU加点启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,即在8086PC
                刚启动时CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是开机后执行的第一条指令
        *******        CPU将CS:IP指向的内存单元中的内容看作指令,CPU用CS:IP合成指令的物理地址到内存中取指令
                内存中一段信息曾被CPU执行过,那它所在的内存单元必然被CS:IP指向过.

修改CS\IP的指令:__________        CPU中程序员能够用指令读写的部件只有寄存器,通过改变寄存器内容控制CPU.
                CPU从何处执行指令由CS\IP中内容决定,可以通过改变CS\IP中的内容来控制CPU执行目标命令.
        ***        Mov指令被称为传送指令.可以改变大部分寄存器的值,但不能用于设置CS\IP的值.CPU没提供功能
                能改变CS\IP内容的指令统称转移指令,如 jmp 指令,用法 [jmp 段地址:偏移地址] :
                jmp 2AE3:3        CS=2AE3H,IP=0003H        CPU将从2AE33H处读取指令
                jmp 3:0B16        CS=0003H,IP=0B16H        CPU将从00B46H处读取指令
                [jmp 段地址:偏移地址]        用指令中给出的段地址修改CS,偏移地址修改IP.
        ***        修改IP内容.用法如 [jmp 某一合法寄存器] 指令:
                jmp ax        指令执行前: ax=1000H CS=2000H IP=0003H 执行后: ax=1000H CS=2000H IP=1000H
                jmp abx                    bx=0B16H CS=2000H IP=0003H               bx=0B16H CS=2000H IP=0816H
                [jmp 某一合法寄存器] 指令功能为: 用寄存器中的值修改IP
                (jmp ax 含义上似 mov IP,ax)(jmp 3:01B6含义上似 mov CS,3 | mov IP,01B6)
        ***        要使内存中某代码段中的所有指令被执行,必须将CS:IP指向所定义代码段中的第一条指令首地址
                如:123B0H~~~123B9H代码段,可设CS=123BH~~~IP=0000H
____________________________________________________________________________________________________
        (1)段地址在8086CPU段寄存器中存放,CPU要访问内存时由段寄存器提供内存单元的段地址,8086CPU有4个
段寄存器,其中CS用来存放指令的段地址.
        (2)CS存放指令的段地址,IP存放指令的偏移地址.8086机中任意时刻CPI将CS:IP指向的内容当作指令执行.
        (3)8086CPU工作过程:
                一        从CS:IP指向的内存党员读取指令,读取的指令进入指令缓冲器;
                二        IP指向下一条指令;        (IP=IP+N)
                三        执行指令.                (转到步骤一,重复过程.)
        (4)8086CPU提供转移指令修改CS\IP中的内容.
        ******        CPU 4 次修改IP:                1.读取mov ax,bx2.读取sub ax,ax 3.读取jmp ax 4.jmp修改IP为ax
                mov ax,bx        (ax=bx,bx送入ax)
                sub ax,ax        (ax=ax-ax ,前减后)
                jmp ax                (修改IP偏移地址为ax)
                将要执行的下一条指令的地址是ax(0H),而ip永远指向下一条将要执行的指令,即ip=0H.
____________________________________________________________________________________________________

Debug主要指令:                [查看寄存器内容的第三行是下一个IP地址的单元数据]
        R        查看\改变CPU寄存器内容
        D        查看内存中的内容                }可直接输入偏移地址,段地址从DS中读取
        E        改写内存中的内容                }可直接输入偏移地址,段地址从DS中读取
        U        将内存中的机器指令翻译成汇编指令
        T        执行一条机器指令                (执行cs:ip单元处的指令)
        A        以汇编命令的格式在内存中写入一条机子指令
        Q        退出Debug
        P        用来执行int 21 返回汇编指令;一次运行完N次循环的命令行.
                                **访问内存单元IP时cs:ip可直接写成cs:1 来访问内存.
R        指令 R ax → 出现":" → 输入要写入的数据"FFFF" → 指令 R →AX=FFFF
D        指令 d 1000:0000 (d 段地址:偏移地址)        会列出指定内存单元开始的128个内存单元的内容
        出现的单元内容每行中间有个"-",用来方便查看,比如要想找出1000:001B单元处的内容,可以从中间开始
        找,"-"前半部分单元编号是1000:0010-1000:0017 , 后半部分是1000:0018-001F .
        左边是每行的起始地址,右边是每个内存单元中的数据对应的可显示的ASCII码字符,如:单元数据为:70H
        右边相应位置会显示"p",如果数据是0AH,没有对应可显示的ASCII字符,Debug就用"."来代替.
D        指令 d 1000:9 (Debug 从 1000:9 处开始显示内容,一直显示到1000:88,1000:0-1000:8单元内容不显示)
        → 指令 d (接着使用d命令) → 可列出后续内容1000:0089……1000:0108
D        指令 d 1000:1 7 (d 段地址:起始偏移地址 结尾偏移地址)→ 显示1000:1-1000:7中的内容
D        查看内存单元10000H中的内容: [d 1000:0 0][d 0fff:10 10][d 0100:f000 f000]三种命令都可以.
        段地址×16H + 偏移地址=10000 物理地址        起始偏移跟结尾偏移相同的话就显示指定的那一个单元内容
E        指令 e 1000:0 0 1 2 3 4 5 6 7 8 9 10 → 1000:0 = 0 1000:1 = 1……1000:A = 10 ,也可以单个修改
        指令 e 1000:10 → 出现":" → 第一个输入内容会送入1000:10,按下空格键跳到第二个单元输入内容,将
        会送入到1000:11 → 输入数据 [01 61 02 62 03 63] → 右边将会显示[.a.b.c]:ASCII码为61H\62H\63H
        想要显示a+b\c++\ibm则输入数据61\2B\62\63\2B\2B\49\42\40        以上E命令是向内存中写入字符串
E        **向内存1000:0单元中写入机器码**        机器码                对应的汇编指令
                                                b80100                mov ax,0001
                                                b90200                mov cx,0002
                                                01c8                add ax,cx
        使用指令 [e 1000:0 b8 01 00 b9 02 00 01 c8]
U        指令[u 1000:0] → 右边将会显示对应的汇编指令        
T        输入 r 指令,内存中的数据和代码没有任何区别 → 指令[T] 执行CS:IP指向的一条或多少指令 → 指令
        [T](继续执行后面的指令)→CPU相关寄存器内容变化
A        指令 [a 1000:0] (出现1000:0000 输入汇编指令:mov ax,1 ,可以使用u命令查看) → 指令 [T] →执行
        命令→继续输入指令 [T] → 执行第二条命令(mov cx,0002)
____________________________________________________________________________________________________

mov ax,1        赋值, ax=1 , 1 送到 ax 中
add ax,1        加法, ax=ax+1 , 把ax + 1 结果存入 ax
jmp 2000:0003        跳转, 跳转到段地址2000:0003单元地址.(cs=2000 ip=0003,继续执行将循环第二到第三条指令)
        [add ax,1        jmp 2000:0003        add ax,1        jmp 2000:0003……………………]
***        PC机主板上的ROM有一个生产日期,在内存FFF00H-FFFFFH的某几个单元中,因为是ROM所以不能修改
        [d FFF0:0 FF]→出现类似(01/01/92)的内容就是生产日期,实际地址为[FFF0:5 C](FFF05H-FFF0CH)
评论次数(0)  |  浏览次数(548)  |  类型(笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码