以下是本人学习王爽老师的《汇编语言》一书之后的一些小总结 内容比较倾向于草稿 不适合正式学习
学习汇编的初衷是想更加深入的理解计算机的运行原理,也希望汇编这种最接近底层的语言能够在我使用高级语言时提供更好的设计思路。ps.当我发现学操作系统时需要用到很多汇编语言时 内心是无比激动的。
也许日后不会使用很多汇编 但是能看懂未来某个阴暗角落里无法避免的汇编代码 也算是解决了后顾之忧
--------习惯唠嗑的小菜鸡

  • 汇编语言的产生: 机器只能识别机器语言也就是一系列机器指令,一列二进制数字。计算机将之转变为高低电平来使得电子器件收到驱 动,进行运算。然而这种语言对于人类不够友好,开发和调试周期很长。于是人们定义 规定出一套对人类更加友好的语言 汇编来解决这个障碍

  • 汇编语言的组成:汇编语言由下列三类指令组成

  • 汇编指令 机器码的助记符 对应着机器码(核心)

  • 伪指令 由编译器执行 计算机不执行的代码 不对应机器码

  • 其他符号 加减乘除等符号 由编译器识别 计算机不执行

汇编语言其实就是机器语言便于记忆的书写格式,写法上更接近人类的语言,便于阅读和记忆
编译器:将汇编语言翻译成机器码,以供机器执行

  1. 存储器 :如果CPU提供大脑的运算功能,那么存储器就是用来提供记忆的,指令和数据都存在里面,直接或间接地被CPU读取来运行
    再聪明的人没了记忆都无法思考,所以存储器地地位仅次于CPU,思考的前提就是运用CPU读取存储器。

  2. 指令和数据:数据和指令在内存中是没有区别的,实质都是机器码,当它被CPU读取并识别时CPU就会区别二者的不同意义 什么是数据 什么是指令。

  3. 存储单元:一个存储单元为8bit 即 1byte 是形容微机存储器容量最小单位

  4. CPU对存储器的读写过程:

CPU想要向存储器读写数据必须有三个步骤
a 找到数据地址
b 选择哪个器件 选择读还是写
c 令数据传输
对应的我们需要有三种总线
a 地址总线 将地址信息发出
b 选中存储芯片 通知它将要从中读/写数据
c 存储器/CPU 发送信息

  1. 总线(地址,数据,控制)
    数据总线:它的宽度决定了每次能传输多少数据
    宽度为 8 代表每次可传输一个8位的二进制数据 如果要发送16位必须分两次发送 且后面的数据先发送
    宽度位16 代表每次可传输两个字节的二进制数据

控制总线:控制总线代表了对系统中其他器件的控制能力,读写过程其实是不同总线来共同承担的
(“读信号输出控制线” “写信号输出控制线”)

  1. 内存地址空间:
    一个CPU的地址总线宽度为10 那么可以寻址2^10 也就是1024个 存储单元 ,这些可以被查询到的地址单元的集合就是这个CPU的内存地址空间

  2. 主板 :将所有器件(核心器件 主要器件 )整合在上面 通过总线相连

11.接口卡 CPU无法与外围器件直接通信 需要有中转设备 接口卡

CPU-------扩展槽上的接口卡-------外围设备

12.各类存储器芯片
存储器读写属性上分类
随机存储器 RAM 可读可写 带电存储 掉电丢失

                                      只读存储器  ROM  只可读  掉电不丢失

存储器从功能和连接上分类
随机存储器 —主随机存储器(主板上RAM+扩展插槽上的RAM) 储存绝大多数程序和数据
装有BIOS的ROM
接口卡上的RAM 显存 用于暂时存储信息 我们将要显示的内容先写入显存 然后他会将信息发送到显示器上

13.内存地址空间
所有的物理存储器被看作一个由若干存储单元组成的逻辑存储器;
每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间;
CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
不同的计算机系统的内存地址空间分配情况是不同的。
8086CPU的最小存储单元是字节 8BIT

如图 我们常将每一个存储单元都用16进制数标记按出

三种信息:
地址 数据 控制

通过三种总线来区分三种信息:
地址总线 数据总线 控制总线

地址总线的宽度决定了CPU能够寻址的存储单元的大小以及CPU寻址的速度

数据总线的宽度决定了CPU和外界的数据传送速度
8088 8位
8086 16位 速度快一倍

控制总线的宽度决定了CPU对外部器件的控制能力

内存地址空间的概述:
主板和接口卡的概念:

CPU访问内存单元时要给出内存单元的地址,所有内存单元构成的存储空间是一个一位的线性空间,这个唯一的地址也就称为物理地址

8086CPU给出物理地址的方法:
8086有20根地址总线 寻址能力是2的20次方=1M
但是8086内部是16位的结构 它只能传送16位的地址,表现出的寻址能力却只有64K

由图中我们可以看出,地址加法器会将段地址x16再加上偏移地址 例如:
段地址1230H X 16 + 偏移地址00C8 = 12300 + 00C8 = 123C8
将16位地址转化为20位 就可以将外部总线的资源充分利用起来

一个错误的认识:内存被划分为一个一个的段,每一个段有一个段地址

纠正:内存并没有分段,段的划分来自于CPU 由于8086CPU为16位结构而外部地址总线为20位 所以为了充分利用总线资源
采用段地址x16+偏移地址=物理地址的方式给出内存单元的物理地址使得我们可以用分段的方式来管理内存
(从CPU的角度看 内存空间只是一个线性空间)

用于提供段地址的四个段寄存器:
CS code DS data SS stack ES extern

CS为代码段寄存器
IP 为指令指针寄存器


DS寄存器用于存储段地址 ,配合[ x ]将段地址*16 + x来寻址和拿去数据
DS 是个害羞的小女孩 间接赋值

mov add sub指令的几种形式

一个例子:
mov ax,1000
mov ds, ax
mov bx,[0]
mov [0],bx

mov 寄存器,寄存器 mov ax,bx
mov 寄存器,数据 mov ax,1000
mov 寄存器,内存单元 mov bx,[0]
mov 内存单元,寄存器 mov [0], bx
mov 段寄存器,寄存器 mov ds,ax

数据段:
CS:IP所指就是代码段
DS:[X]所指就是数据段

将段地址123B0H - 123BAH的内存单元定义为数据段 累加这个数据段中前三个单元的地址:
mov ax,123B
mov ds,ax
mov al,0
add al,[0]
add al,[1]
add al,[2]


PSP用于DOS与被加载程序的通信 常用于debug

DOS 磁盘操作系统 主要是一种面向磁盘的系统软件。 简单来说就是人与计算机之间的一座桥梁
可以不必记忆机器码而用更加自然的语言操纵机器(是罩在机器硬件外面的一层“外壳”SHELL)

在不能确定一点内存空间是否存在重要数据的时候不可以随意向其中写入内容 否者会引起死机 PC机中 一般程序以及DOS都不会占用00200 -
002FF这一块256字节的内存 被称为安全空间

CX loop下代码的执行次数

CS:IP
DS:SI DI BX 操纵[bx]中的数据时如果没有显式说明 都默认段地址在DS中
SI DI也和BX相似 但不能被分为两个8位寄存器使用 即部分low位和high位

SS:SP BP 操纵[bp]中的数据时如果没有显式说明 都默认段地址在SS中

寻址方式有如何约定:

标志寄存器

  1. ZF-零标志 zero flag
    ZF标记相关指令的计算结果是否为0
    ZF=1(ZR),表示“结果是0 ”,1表示“逻辑真”
    ZF=0 ( NZ ),表示“结果不是0”,0表示“逻辑假”
  2. PF-奇偶标志 parity flag
    PF记录指令执行后,结果的所有二进制位中1的个数:
    PF = 1 (PE ),表示1的个数为偶数
    PF = 0 (PO),表示1的个数为奇数
  3. SF-符号标志 sign flag
    SF记录指令执行后,将结果视为有符号数
    SF = 1 (NG), 表示结果为负
    SF = 0(PL),表示结果为非负
    SF 标志是CPU对有符号数运算结果的一种记录 。
    将数据当作有符号数来运算的时候,通过SF可知结果的正负;将数据当作无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值。
  4. CF-进位标志 carry flag
    在进行无符号数运算的时候,CF记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值
    CF=1(CY), 表示有进位或借位
    CF=0(NC), 表示无进位或借位
  5. OF-溢出标志 overflaw flag
    在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出
    OF = 1(OV), 表示有溢出
    OF = 0(NV), 表示无溢出
    eg:
    mov al,0F0H
    add al,88H
    执行结果:CF=1, OF=1
    即当无符号数运算有进位,当有符号数运算有溢出

汇编语言中用于开内存的几个操作符:
dw db dd 三者前面的d为define 定义 w:word b:byte d:double word

mov word ptr ds:[2],0

dup 用于配合上面开内存的三个操作符号使用初始化内存上的数值 例如:
db 3 dup(0) ;开了三个字节的内存并初始化为0
db 3 dup(0,1,2); 开了三个字节的内存并分别初始化为0,1,2

简洁的初始化方法:
db 0,1,2

offset 是由编译器识别的一个符号 用于获取标志的地址 例如:
assume code:codesg
code segment
start : mov ax,offset start
s : mov ax,offset start
code ends
end

转移指令:
转移的意思就是跳转pc指针 修改cs:IP的地址
80x86的转移行为有两种:段内转移 (jmp ax) 段间转移(jmp 1000:0) 区别在于是否跨出了一个段(2^16=64k)的距离
80x86的转移指令有:条件转移,无条件转移,循环loop,过程,中断。

jmp 使用jmp需要给出跳转的大致距离长短 和 具体的目的地址

jmp short
jmp near ptr
jmp far ptr

jcxz 条件跳转
loop 循环 配合cx寄存器和标志使用

call和ret retf

call指令可以:
将当前CALL指令下一条的CS IP 放入栈中 然后转移到目标位置 也分近转移和远转移
call 标号/寄存器
call far ptr 标号/寄存器
call word ptr ds:[0]

ret retf指令可以看成call指令的逆过程:
将栈内的数据弹出并赋值给CS IP 然后转移到CS IP 所指的位置

CALL RET 配合使用实现函数的调用与返回

函数的设计还需要有 传入参数和返回值 实现传参和返回值的方法有:
1 只有少量的参数和返回值的情况下使用寄存器储存数据
2 大量参数时的解决方法:
将参数放入一段内存中 然后将这段内存的起始地址放入寄存器来传参 返回值也可依照存储
当软这段内存也可以是栈

中断:定义学过单片机的都懂 不必赘述
产生中断的原因:1 除法错误
2 单步执行
3 执行into指令
4 执行int指令

CPU用一个字节(256)存储一个名为中断类型码的标记 可以存储256种不同的数据来标识256种不同的中断类型
CPU会由中断信息中获取到中断类型码去到一块内存中查询中断向量表 那里面储存了每一种中断类型对应的中断服务函数的起始地址 拿到起始地址就可以设置CS IP来执行对应中断服务函数::

所以 相应的 中断处理函数中需要写出用户自己的处理过程 还需要iret指令:
pop ip
pop cs
popf //恢复标志位

除此之外 要想在CPU内部产生中断还可以人为主动地去产生中断 这就需要利用指令 :int + 中断类型码

Assembly基础知识相关推荐

  1. poll和死锁_计算机基础知识

    转自: http://blog.csdn.net/qq_15437629/article/details/52388685 在这里只做备份 计算机网络 TCP/IP 模型 TCP/IP协议集的分层实施 ...

  2. 《Linux内核完全注释》《完全剖析》 » 阅读本书所需的基础知识 -- 再次强调。

    转贴网址:http://www.oldlinux.org/oldlinux/viewthread.php?tid=2551&extra=page%3D1 [这个贴子最后由redgrid在 20 ...

  3. android 集成同一interface不同泛型_C# 基础知识系列- 10 反射和泛型(二)

    0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...

  4. linux基础知识ppt下载,《Linux基础知识》PPT课件.ppt

    <<Linux基础知识>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<Linux基础知识>PPT课件.ppt(26页珍藏版)>请在装配图网上搜 ...

  5. 微信小程序(一)基础知识

    最近想大概的了解一下微信小程序的基础部分知识,这是一份微信小程序基础总结! 什么是小程序 ? 如何全面具体的学习? 注册与新建小程序 认识开发工具 目录结构与代码构成 JSON 配置文件 WXML 模 ...

  6. 基础篇:5)机械产品的基础知识与图纸必备

    本章目的:了解一个机械产品的基础知识,明确整套图纸包括哪些.完备的图纸是优质产品的基础. 1.前注 ①学会了出图,就要明白该出哪些图纸,和明确这些图纸的作用: ②不要等到开模后装配图还没有出(别说,这 ...

  7. 英语专业计算机基础知识,计算机专业英语基础知识

    <计算机专业英语基础知识>由会员分享,可在线阅读,更多相关<计算机专业英语基础知识(25页珍藏版)>请在人人文库网上搜索. 1.专业英语知识补充,本章学习要点,专业英语与公共英 ...

  8. goang基础知识小全

    1.基础知识: 1.1 命名.变量.操作符.基本输入输出.程序结构等 Go语言的主要特征: 1.自动立即回收. 2.更丰富的内置类型. 3.函数多返回值. 4.错误处理. 5.匿名函数和闭包. 6.类 ...

  9. C#基础知识之依赖注入

    C#基础知识之依赖注入 一.依赖注入的引入 二.探究依赖注入 一.依赖注入的引入 1.讨论会 话说有一个叫IGame的游戏公司,正在开发一款ARPG游戏(动作&角色扮演类游戏,如魔兽世界.梦幻 ...

最新文章

  1. 【迁移学习(Transfer L)全面指南】零次学习(Zero-Shot Learning)入门
  2. java web一: xml
  3. php执行zip压缩,PHP执行zip与rar解压缩方法实现代码
  4. 【测试工具】禅道项目管理工具设置触发邮箱
  5. 使用Docker搭建Consul集群
  6. 重启小狼毫输入法,rime输入法重启
  7. 用C#设计一个四则运算器
  8. Ogre3D的GOOF的场景编辑器截图
  9. 如何轻松搞定SAP HANA数据库备份?
  10. IAR for ARM系列教程(一)_新建软件工程详细过程
  11. matlab画图命令
  12. 第三单元JML地铁系统博客 By Wazaki
  13. ManageEngine云ITSM系统助斯德雷特(Sterlite)年处理5万个工单
  14. 第十三届蓝桥杯大赛软件赛省赛(b组c语言)
  15. 计算机对体育专业就业前景,体育教育就业方向及就业前景分析
  16. SequoiaDB巨杉数据库成为唯一入选 “硅谷2016 大数据地形图”中国厂商, 企业级市场超越MongoDB等海外产品...
  17. 大语言模型将如何影响软件开发?
  18. 二叉平衡树(AVL树)详细理解
  19. 纯干货-17 分布式深度学习原理、算法详细介绍
  20. 21秋期末考试个人与团队管理10257k2

热门文章

  1. python解压rar_Python解压 rar、zip、tar文件的方法
  2. GridView简单使用
  3. Codeforces-1687 A: The Enchanted Forest 【贪心、简单数学】
  4. 三星N148上网本上安装windows 2000
  5. AI学习笔记:人工智能与机器学习概述
  6. 一个安卓应用,实现追书追剧追漫画三不勿!
  7. 熔断器模式(CircuitBreaker)
  8. 几种Wiki文档系统比较:Teambition thoughts 语雀 Notion GitHubWiki Confluence
  9. 穷则独善其身,达则兼济天下
  10. 处理数据库模糊查询%,_问题(JAVA)