小恐的汇编语言学习笔记

本文详细介绍了8086CPU中的进制表示,包括十六进制、十进制和二进制,以及通用寄存器AX、BX、CX和DX的结构和功能。寄存器可以分为高位和低位,用于处理字节和字型数据。此外,文章还讨论了CPU如何通过段地址和偏移地址进行内存寻址,并介绍了DEBUG工具的使用,如-a(修改)、-r(查看)和-t(执行)命令。内容还包括栈的概念和操作,以及如何设置和使用栈。
摘要由CSDN通过智能技术生成

进制表示

》在数字后面加上h是十六进制
》数字后面什么都不写是十进制
》在数字后面加上B表示二进制

寄存器

AX、BX、CX、DX
》》只有这四个是其它寄存器所没有的
》》这四个称之为通用寄存器
》》一个字节等于8bit
》》两个字节等于16bit
》》》可以表达16个0到16个1
》》》或则是0到FFFFH
》》》0d到65535
》》》可以有65536哥状态

》这四个字节可以各自分割为两个八位寄存器
》》AX-AH+AL
》》BX=BH+BL
》》CX=CH+CL
》》DX=DH+DL
》》H是hig
》》L是low
》》表示范围是8个0到8个1
》》》0到FF
》》》0到255
》》》能表示256个状态
》》16位是:0000左边00是H寄存器右边00L寄存器

》八位寄存器是为了兼容
》内存最小单位是8bit
》CPU从内存中提取一个字节(byte)一个字节等于8bit

》CPU可以一次性的处理两种尺寸的数据
》》字节型数据 1byte 8bit 八位寄存器中
》》字型数据 2byte 16bit 十六位寄存器中
》》》字型数据有高位字节(AH、BH、CH、DH)和低位字节(AL、BL、CL、DL)
》》》只有ax、bx、cx、dx有高位与地位

》debug指令 -a -r -t
》》-a是修改
》》-r是查看
》》-t是执行

-a修改  
mov ax,5    
-r查看  
ax就变成0005了 

》在使用mov指令时要保证数据与寄存器之间位数的一致性

》mov指令就是把逗号右边的数值放进逗号左边的寄存器里面去
》》mov ax,5就是把5放在ax寄存器中去
》》mov ax,0也是十六位的

》数据与寄存器之间一定要保证一致性
》》mov ax,bl如果位数不一样就会报错
》》mov bh,ax也是不可以的
》》mov al,100debug中只认识16进制不认识10进制
》》》已经超过了八位数据
》》mov al,0005也是不可以的
》》》这是一个十六位数值

》add
》》add是加法的意思

mov ax,18h
mov ah,78h
add ax,8

mov bx,ax
add ax,bx

》》加法指令就是将逗号左边的寄存器或值与逗号左边的寄存器相加然后再存放在逗号左边寄存器当中

就相当于 AX=AX+8

》八位加法

8位加法
mov ax,8
mov ax,93
add al,85h

》》93+85=118已经超过了al能保存的最大值
》》不会进位到ax中的
》》八位运算都是互相独立的是不会互相影响的
》》只会留下后两位18
》》前一位会被抛弃掉
》十六位加法

mov ax,0
moval,93h
add ax,85h

》》在十六位当中相加85就不会出现那些情况了

》寄存器都是互相独立的
》》不会影响到其它寄存器的
》》AL就是AL
》》AH就是AH

表示内存地址信息的寄存器

》地址寄存器
》》ds
》》es
》》ss
》》cs
》在debug里会有073F:0100类似这样的显示
》》冒号左边是段地址寄存器
》》》ds、es、ss、cs
》》》都是十六位的
》》冒号右边的是偏移地址寄存器
》》》sp、dp、si、di、ip、bx
》》》都是十六位ed

》8086CPU有20根地址线
》》》表示范围
》》》20个0到20个1
》》》0到FFFFFH
》》8086的CPU寄存器都是16位的
》》地址线的数量决定了cpu的寻址能力

地址加法器

》段地址乘以16(10H)+偏移地址=物理地址
》》段地址乘以16=基础地质
》》基础地址+偏移地址=物理地址
》》段地址:F230H ×10H 偏移地址C8H =F23C8H
》》解释说明
》》》学校0m 体育馆2000m 图书馆2826m
》》》从学校到图书馆最快的距离是从学校直接走2826m可以到图书馆,图书馆就是物理地址
》》》另一条路先走2000米到体育馆再走826m到图书馆2826m
》》》》2000是基础地质
》》》》826是偏移地址
》》》》2826是物理地址
》》》只能通过两个三位数字的纸条告诉你怎么去图书馆
》》》》拿到纸条后将第一张纸条中的数字乘以10然后再加上第二张纸条中的数字就可以到达图书馆了

CPU区分指令与数据

》debug指令
》》-u将某个内存地址开始的字节全部当做指令
》》-d将某个内存地址开始的字节全部当做数据
》》-r 查看、或修改某个中的值比如 -r ds

》CPU是怎么表示内存地址的
》》通过段地址寄存器和偏移地址
》》段地址寄存器
》》》DS、ES、SS、CS
》》偏移地址寄存器
》》》IP、SP、BP、SI、DI、BX
》》》IP寄存器与指令有关

》在8086cpu中在任意时刻CPU将CS、IP所指向的内容全部当做指令来执行
》在内存中指令和数据是没有任何区别的都是二进制信息
》》CPU只有在工作的时候才将有的信息当做指令有的信息当做数据
》CPU中的CS段地址寄存器和IP偏移地址寄存器组合的时候从中读取内容
》》这时候将读取出来的内容当做指令来执行
》》CS和IP决定了CPU从哪里开始读取地址

IP寄存器和指令的关系

》指令是有长度的
》》一条指令可以由多个字节构成

》指令的执行过程
》》第一步CPU从CS:IP所指向的内存单元读取指令,存放到指令缓存器中
》》第二步IP=IP+所读指令的长度,从而指向下一条指令
》》第三步执行指令缓存器中的内容,然后返回到第一步读取新的指令

-a
mov ax,1000h
mov bx,1000h
mov dl,10h
-r
现在的IP是100
这条指令073F:0100 B80010有三个字节
IP所读指令的长度073F:0100是三个字节是103

修改CS、IP寄存器的指令

》新指令jmp
》》转移指令
》》可以修改CS和IP这两个寄存器,决定了CPU从哪里读取指令

》jmp的写法

-a
jmp 2000:0

》》要注意的细节会变成2000:0000这里的0会变成十六位的0
》》把2000放进CS中
》》把十六位的0000放在IP中
》》这样就改变了CS和IP
》》8086CPU的CS与IP只能使用jmp来修改

》监测点2.3
》》下面三条指令执行后,CPU被鸡翅修改IP?都是在什么时候?最后IP中的值是多少?

将存放到指令缓存器中修改了一次IP    
mov ax,bx   
将存放到指令缓存器中修改了一次IP    
sub ax,ax   
将存放到指令缓存器中修改了一次IP    
最后IP内容是0这里是第四次   
jmp ax  

》》sub是减去对应add指令
》》CPU从CS:IP所指向的内存单元读取指令,存放到指令缓存器中
》》IP=IP+所读指令的长度,从而指向下一条指令
》》执行指令缓存器中的内容回到第一步

debug调试工具

》-r查看寄存器中的所有内容
》》将CS和IP指向的机器码翻译成汇编指令
》》也可以修改寄存器中的内容-r ax
》-d查看内存中的内容
》》左边的部分是地址
》》中间的部分是内存地址中相应的内容
》》右边是SACII编码
》-u指令是从这个内存地址开始然后把机器码翻译成汇编指令
》》-u 1000:0将1000:0000开始的机器码翻译成汇编指令
》-a想内存中写入一条汇编指令
》》可以修改掉原来的值
》-t指令将CS和IP指令的机器码执行
》》这是debug最重要的动作
》-e可以修改内存中的内容
》》-e 2000:0
》》-e的另一种用法
》》》-e 2000:0 “0123456789”
》》》这些是ascii编码

寄存器内存的访问

mov ax,4E20H
》》这是一个字型数据
》》有两个字节
》》高位字节
》》》高位是4E
》》低位字节
》》》低位是20
》》字形数据在内存中是高位在后面低位在前面
》》》也就是20 4E 这样存放的
》一个字形数据,存放在内存中,可以由两个连续的地址的内存单元组成
》》高地址内存单元存放字形数据的高位字节
》》低地址内存单元存放字形数据的低位字节

DS寄存器与[]

》内存地址去访问内存
》》8086CPU通过段地址和偏移地址
》ds段地址寄存器访问数据用的

mov al,ds:[0]
mov al,ds:[1]
mov al,ds:[2]
mov al,ds:[3]

mov bx,1000h
mov ds,bx

mov ax,ds:[0]    ;mov移动指令都好左边是CPU中的AL寄存器,逗号右边是内存地址;冒号左边是ds段地址,冒号右边[]里面是偏移地址,将段地址和偏移地址进行组合得到的物理地址得到里面的内容
mov ax,ds:[1]
mov ax,ds:[2]
mov ax,ds:[3]

mov ds:[0],ax
mov ds:[1],ax

mov ds:[0],al
mov ds:[1],ah

》》ds寄存器是不能直接修改的需要通过数据寄存器间接修改

mov bx,1000
mov ds,bx
-d 1000:0
-a
mov ax,[0]
mov ax,[1]
mov ax,[2]
mov ax,[3]

寄存器内存的访问

》数据在内存中是倒过来存放的
》》比如mov ax,4E20
》》在内存里就是20 4E
》一个字形数据,存放在内存中,可以由两个连续的地址的内存单元组成
》》高地址
》》》存放高位字节
》》低地址
》》》存放低位字节

mov ax,ds[0]
》》将逗号都变得指令移动到逗号左边
》》中括号中的0是偏移地址
》》》将段地址ds和偏移地址0进行组合得到的物理地址得到里面的内容
》》CPU从内存中读取的数据是一个字节
》ds段地址寄存器不能直接修改只能用数据寄存器间接修改

mov bx,1000
mov ds,bx

》逗号右边编程寄存器逗号左边变成内存地址

mov [0],ax
mov [1],ah

》栈是一段连续的内存单元,也就是一段连续的内存地址
》栈就像是把书放进一个箱子里面
》》第一本书放在最下面最后一本放在最上面
》可以为最上面的书做一个标记
》》标记代表箱子中最上面的这本书在箱子中的那个位置
》》栈的术语
》》》栈顶标记
》》》》标记了小巷子中最上面的这本书
》》》栈
》》》》箱子
》》》入栈
》》》》将书放进箱子重最上面的位置
》》》出栈
》》》》将箱子中将最上面位置的书拿走
》由于不断地入栈或出栈我们需要不断地修改栈顶标记来确定箱子中最上面的书在箱子中的位置

栈的概念内存的视角

》指令
》》入栈push
》》》将16位寄存器或内存中的字形数据栈顶标记上面
》》出栈pop
》》》将栈顶标记所标识的字型数据放进十六位寄存器或者内存中
》操作的数据长度
》》字型数据
》》》比如push ax bx cx ex
》》》如果是push al bl cl dl这是不行的
》入栈的时候决定了,你放的书(数据)存放的位置
》》修改栈顶标记
》出栈时决定了你拿走书(数据)的位置
》》修改栈顶标记
》栈顶标记是内存地址
》》内存地址是段地址偏移地址来表示的
》》在8086CPU中在任意时刻将段地址寄存器SS和偏移地址寄存器SP所祝贺出来的内存地址当做栈顶标记
》push的执行过程
push ax
》》修改SP寄存器中的数值
》》PS=PS-2
》》将AX中的数据存放到SS:SP所组合出来得到内存地址
》》入栈
》pop的执行过程
pop bx
》》SS:SP所组合出来的内存地址中的字型数据直接存放在bx中
》》修改栈的顶标记 SP=SP=+2称为新的栈顶标记
》》出栈

栈的设置

》箱子花在哪里是由自己决定的
》箱子的容量大小也是自己决定的
》CS和IP决定了CPU从哪里读取指令
》》可以使用转移指令修改CS或者IP
》SS和SP组合出来的内存地址同样在任意时刻在8086CPU中当做栈顶标记
》只要决定栈顶标记在哪里栈就可以在哪里还有大小
》》假设在2000:0处画一个栈
》》箱子的大小从2000:0的十六个字节当做栈的大小

mov ax,2000
mov ss,ax

》》SP等于多少呢
》》》等于10H
》》首先把2000:0开始的十六个字节当做栈的空间
》》入栈出栈都是字型数据
》》》16个byte等于8个字形数据
》》》如果是push指令可以操作八次
》》在设置栈的大小的时候只需要
》》》起始地址+所设定栈的大小字节数
》》》0000+16(10H)
》》》》在debug中它不认识十进制,结果=10H
》》》》10H就是SS:SP所组合出来的栈顶标记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值