汇编语言(王爽) 第2章 寄存器

CPU由运算器,控制器,寄存器等器件组成

汇编指令可以操作寄存器中的数据。如mov AX,BX就是把寄存器BX中的值加上寄存器AX中的值,再把结果放在AX上

8086CPU的寄存器的有14个,这里就讲AX,BX,CX,DX,CS,IP这么几个先

2.1通用寄存器

就是指AX,BX,CX,DX

用来存放一般数据

如AX是16位,但是8086CPU之前的一代是8位的,所以AX分为AH,AL来兼容之前版本的数据

同理 BX,CX,DX.另外AH的H是high的意思,在左边高位,L是low的意思在右边是地位

2.2 字在寄存器中的存储

16进制的一位相当于2进制的4位

二进制的0100111000100000转为16进制就是4(0100)E(1110),2(0010),0(0000)

一个内存单元大小为一个字节,8位

2.3 几条汇编指令

当汇编数据溢出的时候,会自动把高位砍掉

比如AL的数据是C5H,add al 93H就是158H,但是8位的空间只能放2个16进制的数据,所以会变成58H

如果执行 add ax 93H的话,低8位的数据会放到高八位

为啥,因为CPU会认为进行的是16位的运算,原来的值是00C5H,加上的值是0093H.

指令的2个操作对象的位数应该是一致的

下面就是错的栗子

add al,ax

2.4 物理地址

每一个内存单元都有唯一对应的物理地址,CPU想读写一个内存单元的数据的时候,要先找到那个内存单元对应的物理地址

2.5 16位结构的CPU

16位指的是寄存器的宽度是16位,地址的宽度是16位

2.6 8086CPUshow物理地址的方法

8086CPU有20根地址总线,能表示2的20次放个物理地址

但是16位的机器,1次性处理,传输,存储的地址为16位,咋办

8086采用2个16位合成一个20位地址的方法

传送段地址和偏移地址到地址加法器,再输出一个20位的物理地址送到输入输出控制电路,再通过20位的总线到内存去,上图把

地址加法器采用物理地址=段地址*16+偏移地址表示,段地址左移动一位

一个X进制是数据左移动一位,相当于乘以X

2.7 物理地址计算的含义

物理地址=段地址*16+偏移地址

基础地址=段地址*16+偏移地址

物理地址=基础地址+偏移地址

假如我需要给你2888这个4位数,但是我最大只有3位数

那么我就写2张3位数的给你,并且事先规定,第一张要*10

就有了第一张200,第二张888,结果就是200*10+888=2888

2.8 段的概念

内存不会分段,段的划分来自CPU

CPU采用物理地址=基础地址+偏移地址,来给出内存单元的物理地址,我们可以采用假想的分段的方式来管理内存

根据需要,将几个连续的内存单元看成一个段

用基础地址表示起始地址,用偏移量定位段中的内存单元

段的起始地址(基础地址)一定是16的倍数,基础地址=段地址*16+偏移地址

段的最大长度是2的16次方,偏移地址为16位

2.9地址寄存器

段地址放在寄存器CS中,偏移地址放在寄存器IP中

cs+ip就能指向一个具体的内存单元

8086CPU工作流程

1 cs:ip指向读取指令到指令缓冲区

2 ip+指令长度,跳到下个指令

3 执行缓冲区的指令,在跳到步骤1

指令和内容在内存中无区别,但是用CS:IP指向的内存单元就是指令

2.11 修改 cs ,ip指令

jmp 2AE3:3 执行后,cs=2AE3H,IP=0003H,CPU从2AE33H处读取指令

jmp ax相当于mov ip ax

小结

8086cpu有4个段寄存器,其中CS用来放指令的段地址.IP用来放指令的偏移地址

在写代码的时候发现一个很无聊的功能,

输入ffff:0000,可以插到CPU的生产日期,92年的老机子?而且是只读的信息,不知道可靠否。

因为win64位不能直接运行debug,所以要用dosbox来运行,教程如下

http://blog.csdn.net/jiajiayouba/article/details/8537986

时间: 2024-10-07 05:25:00

汇编语言(王爽) 第2章 寄存器的相关文章

汇编语言(王爽) 第3章寄存器(内存访问)

3.1 内存中的字 内存中的字是16位的,以2个内存单元存储 地址大的存高位(字的左边8位),地址小的存低位(字的右边8位) 字单元:存放1个字形数据的内存单元,由2个内存单元组成,共16位 3.2 DS 一个寄存器的名字,用来放数据段的段地址 mov 指令可以把数据转到寄存器,一个寄存器的内容转到另一个寄存器,内存单元(字单元)转到寄存器 但是一般会mov ax,1000h;mov ds,ax而不是直接mov ds,1000h 因为8086CPU不支持直接把内存单元的东西转到段寄存器上面 3.

汇编语言(王爽) 第11章 标志寄存器

这里讲一个特殊的寄存器,flag 先看flag的16位显示 11.1 zf 指令执行后,结果0,ZF=1 指令执行后,结果不为0,ZF=0 11.2 pf 指令执行后,所有bit位中1的个数是否位偶数,若为偶数,那么pf=1 若为奇数,pf=0 11.3 sf 指令执行后,结果负,SF=1 指令执行后,结果不为负,SF=0 11.4 cf 进位 若出现进位,那么CF=1 没有的话CF=0 11.5 of 溢出, 数字的溢出. 8位范围是-128-127 若130就是溢出了 11.6 abc指令

汇编语言(王爽) 第7章 寻址方法

这章讲一些寻址方法,对前面寻址方法的总结把 7.1 and or 2个指令 上栗子 mov al,00001111b and al,11110000b al=00000000b mov al,00001111b or al,11110000b al=11111111b 7.2 ASCII码 之前就写过一篇ACSII码的,这里主要写下我们在键盘上按键再输出到屏幕的过程 我们在键盘上按下a键 这个信息被传到计算机,计算机用ASCII码对它编码,成为61h, 再扔到一个内存段中 文本编辑器把内存中的6

汇编语言(王爽) 第4章 第一个程序

这章算是一个实践部分把,写 了一个汇编程序,并用debug去跟踪每条指令的进程,看寄存器和内存的变化,算是对之前的一个小总结把 4.1 源程序到执行的过程 一个汇编程序写好,要编译成目标文件,文件后缀是obj的,再链接形成exe后缀的,再接着去执行 4.2 源程序 直接上图把 伪指令由编译器执行,汇编指令由CPU执行 assume是伪指令,关联段寄存器和程序中用segment and end代表的段关联 segment 和ends表示段的开始和结束 end表示整个程序结束 另外程序会有个叫程序返

汇编语言(王爽) 第1章基础知识

1.1 机器语言 机器语言就是机器指令的集合.机器指令是啥呢?就是一列二进制的数据,计算机把它转成高低电平,使计算机的其他器件驱动并运算.(计算机如何使用2进制语言?) 早期程序都是用机器语言写的,但是有个问题就是太麻烦,数据信息太长,写错一个0或1就会来BUG了. 这种机器语言根本不是人写的,注定会被淘汰. 1.2 汇编语言 这个时候,汇编语言就挺身而出. 汇编语言就是机器语言的便于记忆的格式把 一个指令1000100010001000 表示把寄存器A1的内容弄到寄存器A2上.如下 操作介绍:

汇编语言(王爽) 第5章[BX]和loop指令

mov ax,[0] 把一个内存单元给寄存器ax,内存单元长度2个字节,偏移地址0,段地址ds mov al,[0] 把一个内存单元给寄存器al,内存单元长度1个字节,偏移地址0,段地址ds so:要描述一个内存单元,需要1.ds和偏移地址2.内存单元长度 [bx]也表示一个内存单元,偏移地址在寄存器bx中罢了 我们用()表示一个寄存器或一个内存单元中的内容 ()中可以是寄存器,段寄存器,内存单元的物理地址 5.1 [bx] mov ax,[bx] 把段寄存器ds和偏移地址在bx中的内存单元的内

汇编语言(王爽) 第8章数据处理的2个基本问题

计算机进行数据处理的时候要知道2个基本问题 要处理的数据放在哪 要处理的数据多长 刚开始定义了2个描述性符号备用 reg和sreg reg 表示一个寄存器如 ax,bx,cx,dx,ah.......sp,bp,si,di sreg表示一个段寄存器 如 ds,ss,cs,es 8.1 bx,si,di,bp 只有这4个寄存器可以放在[]中间和段地址ds或ss搭配进行内存单元寻址 这4个可以单独使用,也搭配使用,但只有4种组合 [bp]的默认段地址是ss,其他3个是ds 8.2 数据放在什么地方

汇编语言(王爽) 第9章转移指令的原理

啥叫转移指令 修改IP或同时修改CS和IP的指令 只修改IP叫段内转移 同时修改CS和IP叫段间转移 段内转移又分为短转移和近转移 短转移 IP修改范围-128-127 近转移IP修改范围-32768-32767 基本的就上面的 9.1 offset 操作符 s1:mov bx,offset s1 s:mov ax,offset s offset X就是取得X的偏移地址 first 就是mov bx,ds:ds:[0] second  is mov ax,ds:[3] first instruc

汇编语言(王爽) 第6章包含多个段的程序

程序到了内存中我们分为code(代码)段,也就是大部分指令段,数据段,栈 6.1 在代码段中使用数据 上图 dw表示define word定义一个字,16位 会出现cs执行的前16位是数据段,后面才是指令,所以要把IP设成10h 或者直接在第一条指令前面在start,再在最后面的end start 程序运行的第一条不是汇编指令可能会报错把 6.2 在代码段中使用栈 这的题目都是从内存单元的数据换到另一个内存单元 开始奇怪,为啥不直接换,还要专门定义一个栈空间出来做个中间体 查了资料才知道,内存单