汇编笔记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所指向的指令
- 汇编学习笔记【3】
- 汇编笔记3
- 汇编笔记3
- win32汇编学习笔记3
- 汇编学习笔记(3)
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 汇编笔记
- 变量的解构赋值
- spring test测试javaweb项目
- Oracle创建表,id为自增序列
- 分布式事务
- Spark 基础学习笔记
- 汇编笔记3
- MKL学习——矩阵向量操作
- Mongdb3.2.4(64bit) 数据库导入导出字段修改等操作
- 简明机器学习教程——实践篇(一):从感知机入手
- 177. Nth Highest Salary
- 原型模式 C#
- python 面试题
- HTML初学笔记2
- Ubuntu下python网络爬虫及机器学习环境安装