典型的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)
- 实验8 这个程序可以正确返回吗? 运行后为什么是这种结果? ■■■详解
- -----------7.9------------有两种方式改变大写字母
- 第六章---------实验6.1 (1) (2)---------详细解答,,,,,,,,~~ 准确答案亲自实验.....不懂提问----------------------------------
- 实验4 --------------____________________________________----个人解释
- ■■■■■■■■■■■■■■■■■实验 10.3 结合 ■除法溢出 ■指定输出字符\颜色 ■数值显示 附□倒序
- ■■■■■■■■■■■■■■■■实验 10.1 万用子程序 (指定位置输出字符与颜色)
- 高手看一下,用本章前的所有知识怎么搞黑客帝国的数字雨效果-.-
- ■■■实验8■■■■实验9 -----------------------过程,,, 源程序测试过■■★ ★
- 实验 9. 3 ■■■ 用loo指令查找内存2000H段中第一个值为0的字节,找到后存储在dx中 ■ ■■■■详细解答
- 实验 7 --------------------准确答案,, 自己编写..经调试验证~~~~~~~~~~~~~~~~~~~~~~~~~~~~~