汇编语言学习笔记-仅供个人

2017-07-11  本文已影响57人  BohrIsLay

汇编语言

基本知识

机器指令存放的地方

CPU 通过指令来控制整个计算机的
指令和数据
计算机有很多部件,它们都是进行分工的

内存
CPU在工作时,需要对指令和数据进行区分

指令和数据是以什么形式存放在内存中的
以二进制形式存放在内存中的(为方便看,翻译成16进制)

255 -> FFH 1111 1111

本节课重点内存
内存也叫做存储单元
内存的最小单位字节Byte - 8个二进制数字 bit 比特 - 2个16进制数字
1Byte = 8bit
44H
0100 0100
对字节(存储单元)进行编号
它们是从零开始编号的

2进制存放(16进制表示)

内存条只是内存的一部分,计算机很多部件都有内存

2进制和内存的关系

内存编号
0 1 2 3 4
CPU 和内存发生联系需要:
内存编号的信息
数据信息
控制信息
我们将描述地址的信号称为地址线:0 或1
地址线的数量决定了能够表示多少个地址
假设我有n根地址线,我就能够寻找到 2的n次方个地址(字节)
10根地址线
0 - 1023
0 - (2的n次方 - 1)

地址线,数据线,控制线

数据线 0 或者1
1Byte = 1bit

控制线
控制线决定了CPU能够对哪些部件进行控制
读写

CPU通过地址线,数据线,控制线和内存打交道

加深对内存的认识

显存 往显存里写东西,会控制显示的输出

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

不允许 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指令

    mov cx,循环次数
标号:循环代码
    loop 标号

先执行标号前代码,再执行标号中代码,然后执行loop代码,进入标号处执行

循环次数为cx的数据

do-while

上一篇下一篇

猜你喜欢

热点阅读