汇编笔记3

来源:互联网 发布:英雄联盟淘宝网 编辑:程序博客网 时间:2024/06/03 18:24


一、CPU存储地址信息和数据信息的地方

寄存器

汇编程序员通过 汇编指令 来修改寄存器中的内容 来控制cpu


开始 ==> 运行  ==>  command  ==>  debug  ==>  r  回车

AX    BX   CX   DX    SP    BP     SI    DI     DS    ES   SS   CS   IP   还有后面那些加起来也是寄存器


AX    BX    CX    DX  通用寄存器   一般存放数据


AX  BX  CX  DX表示的最小值0000  最大值FFFF  由2个字节构成

2Byte(字节)  =  16 bit(位)      表示的值0~65535(2的16次方减1)


这四个寄存器能各自分为2个8位寄存器

AX  =  AH  +  AL              H=High     L=Low     AH能表示的最大值FF(255) AH能表示的最大值FF(255)

BX  =  BH  +  BL                                               BH能表示的最大值FF(255) BH能表示的最大值FF(255)

CX  =  CH  +  CL                                              CH能表示的最大值FF(255) CH能表示的最大值FF(255)

DX  =  DH  +  DL                                             DH能表示的最大值FF(255) DH能表示的最大值FF(255)

******AH和AL都是互相独立的寄存器******* 

BH BL CH CL DH DL 都是这样的

例:

a 回车

mov ax,4E20H

t(执行命令)


 


例:

mov bh,ah

mov cl,al

mov dx,ax



4E20H    既能看成是两个独立的数据 一个是4E 一个是20  又能看成一个整体4E20这整个数据

这是根据寄存器来判断的AH或者AL那是8位寄存器  整个AX那就是16位





二、加深AX,BX,CX,DX寄存器的印象

新增加约定

0101010101B         2进制

45H                        16进制

123                         10进制



1个字节  =  字节  byte

2个字节  =  字      word



例:

mov ax,18H        AX  =  0018H

mov ah,78H        AX  =  7818H

add ax,8H           AX   = 7820H

mov bx,ax           BX   =  7820H

add ax,bx            AX   =  F040H




AL表示的最大值是255 = FF

AX表示的最大值65535 = FFFF

例:

mov al,10000

mov ax,10000

都是错误的


不允许超过寄存器能表示的最大值  会报错


例:

mov ax,8226

mov bx,ax

add ax,bx


8226H+8226H=1044C   这里计算结果超过AX能表示的最大值(FFFF)取后四位(1并没有消失存放到了别的地方)

例:

mov ah,0

add al,85H

add al,93H


85H + 93H = 118H 这里计算结果超过了AL能表示的最大值(FF)取后两位  *****寄存器是互相独立的*****

****并没有产生进位*****(1没有消失 存放到了别的地方)


例:

mov ax,bl   这是错误的

ax是16位寄存器  bl是8位寄存器   他们是不能够互通的





注意

寄存器能够写的最大的值 

一个字节  255     =  FF

一个AX     65535 = FFFF

mov 移动的时候要注意数据长度






三、地址寄存器和地址的合集

地址信息

开始  ==>  运行  ==>  command  ==>  debug   ==>  r 回车  ==> d 回车


冒号左边 和 冒号右边 都是内存地址

左边叫做段地址  右边是偏移地址

DS  ES  SS  CS            段地址寄存器

SI  DI  BP  IP  SP   BX(地址信息也可以当作一种数据)  偏移地址寄存器



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

基础地址  =  段地址  *  16(这是十进制的十六)(10H)

例:

段地址        偏移地址

1230H         C8H        

物理地址 =  1230H*10H  +  C8H  =  123C8H


学校                                 体育馆                图书馆

  0                                     2000                    2826


现在有2张能写4位的纸条

第一张          第二张

0                   2826           直接走2826米到图书馆

2000               826            先走2000米到体育馆再走826米到图书馆

现在有两张能写3位数字的纸条       

这里定个约定 把第一张纸条的数字乘以10

第一张          第二张

200                826                            200(段地址)*10  +  826(偏移地址) 


偏移地址能够表示的最大值是    FFFFH


例题:

1.给定段地址为 0001H,那么只通过偏移地址的变化来寻址,CPU的寻址范围是____到____

0001H * 10H +(0~FFFFH)  =   10H   ~     1000FH


2.有一数据存放在内存20000H单元中,现在给短地址a,如果只用偏移地址找到2000H那么段地址a应该满足的条件是

最大______     最小________

a * 10H  +  ( 0 ~  FFFFH)  =  20000H

a * 10H + 0 = 20000H    ==>  a  =  2000H   检验一下==>    2000H * 10H  +  0  =  20000H

a * 10H + FFFFH = 20000H  ==> a  =  1000H   检验一下==>  1000H*10H+FFFFH = 1FFFFH  不等于 20000H

用1000H的段地址去找20000H内存单元是永远都找不到的 因为偏移地址最大FFFF 最大只能表示1FFFFH

怎么办呢?

1001H 一定能找到20000H   

所以最大2000H   最小1001H




四、CPU通过地址寄存器区分指令和数据

指令和数据是存在内存中的 内存是有编号的  内存又分为ROM和RAM

CPU要获得什么指令 必须要通过这个地址线得到这个内存地址 

哪些寄存器表示地址信息(段地址信息和偏移地址信息)?

DS  ES  SS  CS            段地址寄存器

SI  DI  BP  IP  SP   BX(地址信息也可以当作一种数据)  偏移地址寄存器


********哪两个寄存器组合出来的地址是CPU读取指令的地址?  ==>  CS 和  IP    ***********


*******  CPU将 CS:IP 所组合(指向)出来的地址里面的内容全部当作指令   *********



开始  ==>  运行  ==>  command ==>  debug ==>r 回车


CS:IP 指向  ADD [SI+ 03],DH   这条指令







五、IP寄存器和指令的关系

指令是有长度的,可以由多个字节组成


*****指令执行的过程:*******

1.  CPU 从CS:IP所组成的地址中读取指令,将这个指令存放到指令缓存器中

2.  IP  =  IP  +  所读指令的字节数 ( 这里  007303H  3   个字节)===>(下一个IP就是  0103  了)

3.  执行指令缓存器中的内容,回到步骤1,重复这个过程





六、转移指令

转移指令:

能够修改ip或者cs 或者同时修改的指令

例:

jmp 2000H:0  这是修改cs和ip的  (cs是段地址,ip是偏移地址)


mov cs,2000H   和     mov ip,0   这两个是错误的




例:

mov ax,1000H

jmp ax   这样就修改了ip


mov ip,ax   这是不允许的  

但是这样修改cs 是允许的   mov cs,ax



例:

1. 假设cs = 2000,ip = 0000,写出指令执行的过程

~debug

-a 2000,0

2000:0   xxxxxx  mov ax,6622H         (cs = 2000H   ip = 0 + 3 = 3H 指向2000:3)

2000:3   xxxxxxxxxx   jmp 1000H:3      (cs = 2000H   ip = 3 + 5 = 8H 指向2000:8 )   但是这里jmp修改了cs和ip

2000:8   xxxx mov cx,ax                ********这条指令是被指向过的 但是呢 cs:ip改变了******执行不到这条指令了


-a 1000:0                

1000:0 xxxxxx mov ax,0123H       

1000:3 xxxxxx mov ax,0                 (cs = 1000H  ip = 3 + 3 =6H 指向1000:6)

1000:6 xx mov bx,ax             (cs = 1000H    ip = 6+ 2 = 8H 指向1000:8)    

1000:8 xx jmp bx                   (cs = 1000H ip = 8 + 2 = AH 指向1000 :A)   但是这里jmp修改了ip


mov cx,ax这条指令是被指向过的

  cs:ip被改变过了 所以执行不到mov cx,ax

这里jmp bx 执行后ip被修改

指向了 1000:0 的指令 mov ax,0123


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

mov ax,bx   -> 将指令放入指令缓存器中 -> ip   =  ip + 所读指令的字节数  ->执行

sub ax,ax   ->  将指令放入指令缓存器中 -> ip   =  ip + 所读指令的字节数  ->执行

jmp ax -> 将指令放入指令缓存器中 -> ip   =  ip + 所读指令的字节数  ->执行  -> 修改了ip

一共修改了4次  最后ip的值为0




七、debug调试工具的指令

  开始  --> 运行   --> command  -->  debug

r 直接回车就可以显示所有的寄存器 同时他又将 cs和ip所指向的内容显示成汇编指令

r 寄存器 可以修改寄存器中的内容


d 直接回车 从当前打128个字节

d 段地址:偏移地址

d 段地址:偏移地址1  偏移地址2   (这个是到的意思)




u 将后续的字节翻译成汇编指令 查看汇编指令

u 段地址:偏移地址

u 段地址:偏移地址1  偏移地址2


a 默认的话从当前cs:ip写指令

a 段地址:偏移地址  要注意是否超过它能表示的最大值

e 没有默认 

e 段地址:偏移地址  修改内容



t 执行cs:ip所指向的指令

0 0
原创粉丝点击