汇编语言学习笔记-仅供个人
汇编语言
- 汇编指令
通过编译器可以将汇编指令翻译成机器指令 - 伪指令
告诉翻译软件,也就是编译器,这里怎么翻译,那里怎么翻译,由编译器执行,没有对应的机器指令 - 符号体系
+-*/ 没有对应的机器执行,由编译器执行
基本知识
- 1.什么是机器指令?
0101010101010101的二进制数字 - 2.二进制和机器语言(机器指令的集合)的关系?
二进制可以描述这个机器指令 - 3.机器指令和汇编指令的关系?
通过编译器可以直接翻译 一一对应 - 4.计算机哪个部件,执行机器指令?
CPU
机器指令存放的地方
CPU 通过指令来控制整个计算机的
指令和数据
计算机有很多部件,它们都是进行分工的
内存
CPU在工作时,需要对指令和数据进行区分
指令和数据是以什么形式存放在内存中的
以二进制形式存放在内存中的(为方便看,翻译成16进制)
255 -> FFH 1111 1111
本节课重点内存
内存也叫做存储单元
内存的最小单位字节Byte - 8个二进制数字 bit 比特 - 2个16进制数字
1Byte = 8bit
44H
0100 0100
对字节(存储单元)进行编号
它们是从零开始编号的
- 1.机器指令(汇编指令)和数据存放在哪里?
内存中 - 2.机器指令(汇编指令)和数据是以什么形式存在的?
- 3.内存(存储编号)是怎么计算的?
从零开始 - 4.内存的计量单位
1Byte = 8bit
1KB = 1024Byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
2进制存放(16进制表示)
内存条只是内存的一部分,计算机很多部件都有内存
2进制和内存的关系
内存编号
0 1 2 3 4
CPU 和内存发生联系需要:
内存编号的信息
数据信息
控制信息
我们将描述地址的信号称为地址线:0 或1
地址线的数量决定了能够表示多少个地址
假设我有n根地址线,我就能够寻找到 2的n次方个地址(字节)
10根地址线
0 - 1023
0 - (2的n次方 - 1)
- 1.内存单元为什么从0开始编号?
- 2.什么叫做地址线?
地址线决定CPU可以寻找到多少个地址(2 的n次方)
地址线,数据线,控制线
数据线 0 或者1
1Byte = 1bit
控制线
控制线决定了CPU能够对哪些部件进行控制
读写
CPU通过地址线,数据线,控制线和内存打交道
- 1个CPU的寻址能力为8kb, 那么它额地址总线宽度为? 13
- 1kB的存储器有?存储单元,存储单元的编号从?到? 1024, 0 ,1023
-
3.1KB的存储单元可以存储?bit, ?Byte
1KB = 1024Byte
1Byte = 8bit
加深对内存的认识
显存 往显存里写东西,会控制显示的输出
ROM和RAM
ROM只允许读取, 不通电的情况下里面的数据还是保存的
RAM,允许读取和写入, 电没了就没了
CPU通过内存编号的读写,然后控制部件
CPU将所有部件看成内存地址
CPU存储地址信息和数据信息的地方
寄存器
我们汇编程序员就是通过汇编指令来修改寄存器中的内容 来控cpu
AX, BX, CX,DX
通用寄存器 一般存放数据
FFFFH 2Byte = 16bit 0 ~65535 即0~(2^16 - 1)
mov ax, 40H 将指令40H放到寄存器ax中
AX = AH + AL H = high 高 L = low 低
BX = BH + BL
CX = CH + CL
DX = DH + DL
AH 和AL 等等,都是独立的寄存器 2^8 - 1
加深AX,BX,CX,DX寄存器的印象
mov ax, 18H
mov ah, 78H
add ax, 8H
mov bx, ax
add ax, bx
AX = 0018H
AX = 7818H
AX = 7820H
BX = 7820H
AX = F040H
mov ax, 100000H 会报错,超过最大值FFFFH
mov al, 256H会报错,超过最大值255
add 不会报错,只会截取4位16进制放到ax中,其他的放在别的地方
mov ax, bl 报错, 一个是16位寄存器,一个8位寄存器
注意寄存器能够写的最大值 一个字节是255 -FF
AX = 65535 = FFFFH
练习
mov ax,F4A3H AX = F4A3H
mov ah,31H AX = 31A3H
mov al,23H AX = 3123H
add ax,ax AX = 6246H
mov bx,826CH BX = 826CH
mov cx,ax CX = 6246H
mov ax,bx AX = 826CH
add ax,bx AX = 04DBH (104DBH)
mov al,bh AX = 0482H
mov ah,bl AX = 6C82H
add ah,ah AX = D882H
add al,6H AX = D888H
add al,al AX = D810H (D8110H)
mov ax,cx AX = 6246H
地址寄存器和地址的结合
段地址:偏移地址
ds si
es di
ss bp
cs ip
sp
bx
虚拟8086CPU 20根地址线 20bit 寄存器16bit
物理地址 = 基础地址 + 偏移地址
基础地址 = 段地址 * 16(10H)
段地址 偏移地址
1230H C8H = 1230H * 10H + C8H = 12300H+ C8H = 123C8H
1.CPU存放段地址信息的寄存器? ds es ss cs
2.CPU中存放偏移地址信息的寄存器? bp ip sp si di bx
3.偏移地址能够表示的最大值是多少?FFFF
练习
1.给定段地址为0001H, 那么只通过偏移地址的变化来寻址,CPU的寻址范围是
0001H * 10 H + (0000H~FFFFH)
2.有一个数据存放在内存20000H单元中,现在给段地址a,如果只用偏移地址找到20000H,那么段地址a应该满足的条件是
最小 ? 最大?
A * 10H + (0000H ~FFFFH) = 20000H
解出A即可
CPU通过地址寄存器区分指令和数据
开始 -> 运行 -> command -> debug -> r ->u
指令
a 回车
mov ax, 4E20
t 执行命令
r 换行
r ds回车0回车 修改寄存器里数据
CPU将cs:ip所组合(指向)出来的地址里面的内容全部当做指令
DS寄存器里的内容当做数据
ip寄存器和指令的关系
指令是有长度的,可以由多个字节组成
指令执行的过程:
1.CPU从cs:ip所组成的地址中读取指令,将这个指令存放到指令缓存器中
2.IP = IP+所读指令的字节数
3.执行指令缓存器中的内容,回到步骤1,重复这个过程
转移指令
jump
-
8086提供了一个mov指令(传送指令),可以用来修改大部分寄存器的值,比如
mov ax,10、mov bx,20、mov cx,30、mov dx,40
-
但是,mov指令不能用于设置CS、IP的值,8086没有提供这样的功能
-
8086提供了另外的指令来修改CS、IP的值,这些指令统称为转移指令,最简单的是jmp指令
不允许 jump 33h
可以这样 mov ax,33h
jump ax 跳到ax
1.假设cs = 2000, ip = 0000,
jump第一个语法
jump 段地址:ip地址
jump 2000:3
jump 的第二个语法
jump ax ;意味着,将ax寄存器的值给了IP寄存器
小结
10进制 - > 2机制(机器部分) - >16进制 ->汇编指令 -> 内存 ->内存编号(内存地址)->地址(寻址能力)->数据线 ->控制线 ->寄存器 ->数据寄存器-> 地址寄存器 ->cs:ip ->指令如何执行
机器指令
CPU执行
汇编指令 -> 编译器 -> 机器指令
键盘
鼠标
显卡
内存条
麦克风
网卡
等等
表示地址的电路
地址线 0 或者1
汇编程序员就是通过汇编指令 修改CPU的寄存器中的内容,从而达到控制整个计算机的目的
mov ax,bx 移动指令
add ax,ax
sub ax,ax 运算指令
jum xxxx:xxxx
call xxxx 转移指令
数据在哪里? 地址寄存器组合
AX,BX,CX,DX 通用寄存器
处理数据
将结果存放起来 地址寄存器
debug调试工具的指令
r 打印所有的寄存器
d 段地址:偏移地址 - 偏移地址 打印对应地址的内容
u 将后续的字节翻译成汇编指令 查看汇编指令 段地址:偏移地址
a 段地址:偏移地址
e 段地址:偏移地址 修改内存里数据
t 将。。。放到。。。
内存中数据的长度
:---------------------------------------------------------------------------------------------------------
1.指令在哪里?
2.数据在哪里?
3.数据的长度
4.对数据的处理
5.数据存放在哪里
:---------------------------------------------------------------------------------------------------------
1.cs:ip指向的地址中的内容CPU当做是指令
:---------------------------------------------------------------------------------------------------------
Byte = 8bit (字节型数据) -》 一个内存地址就能保存一个字节
Word = 2Byte = 16bit (字型数据) -》 一个字需要2个地址连续的内存单元来存储, 高位地址存放高位字节,低位地址存放低位字节
mov ax,1122H
AX = AH + AL AX 可以存放一个字型数据 = 可以存放2个字节型数据
BX = BH + BL
0 1 2 3 4 5 6
数据的读取
段地址:偏移地址信息
ds ->段寄存器
同样需要地址信息
mov bx,2000H
mov ds.bx
mov al.ds:[0] -> 2000:0 ->al决定了只取一个字节
Loop指令
- loop指令和cx寄存器配合使用,用于循环操作类似高级语言的for,while
- 使用格式
mov cx,循环次数
标号:循环代码
loop 标号
先执行标号前代码,再执行标号中代码,然后执行loop代码,进入标号处执行
循环次数为cx的数据
do-while