汇编语言

汇编语言学习05之I/O操作系统

别等时光非礼了梦想. 提交于 2020-01-11 03:48:04
汇编语言学习05之I/O操作系统 I/O 访问层次 I/O指 input,output,即输入、输出系统。 和虚拟机类似,I/O系统也有不同的访问层次。主要有以下几个: 1.高级语言函数 高级编程语言,如 C++ 或 Java,包含了执行输入输出的函数。由于这些函数要在各种不同的计算机系统中工作,并不依赖于任何一个操作系统,因此,这些函数具有可移植性。 2. 操作系统 程序员能够从被称为 API(应用程序编程接口,Application Programming Interface)的库中调用操作系统函数。操作系统提供高级操作,比如,向文件写入字符串,从键盘读取字符串,和分配内存块。 3. BIOS 基本输入输出系统是一组能够直接与硬件设备通信的低级子程序集合。BIOS 由计算机制造商安装并定制,以适应机器硬件。操作系统通常与 BIOS 通信。 设备驱动程序 设备驱动程序允许操作系统与硬件设备和系统 BIOS 直接通信。例如,设备驱动程序可能接收来自 OS 的请求来读取一些数据,而满足该请求的方法是,通过执行设备固件中的代码,用设备特有的方式来读取数据。 设备驱动程序有两种安装方法:一种是在特定硬件设备连接到系统之前,或者设备已连接并且识别之后。对于后一种方法,OS 识别设备名称和签名,然后在计算机上定位并安装设备驱动软件。 现在,通过展示应用程序在屏幕上显示字符串的过程,来了解 I

使用汇编语言编写一个简单的X86 Boot loader

耗尽温柔 提交于 2020-01-11 01:57:52
真正一小步,编写属于你自己的X86 Boot loader 前言 参考资料 环境和工具 工具安装 编写Boot Loader 编写用户程序 运行 汇编 创建硬盘镜像 编写Bochs配置文件bochsrc 将Boot loader和用户程序写入磁盘映像 Bochs运行和调试 前言 笔者一直对操作系统非常感兴趣,一直希望能够编写一款属于自己的操作系统。不过各种事情让我一直抽不开身。现在大四了,终于有时间好好搞一搞自己喜欢的东西。 经过深思熟虑,我决定还是从Boot Loader做起。国内各种网站和博客关于这方面内容的东西不是特别多,我在编写Boot Loader的时候也是摸着石头过河。国内大部分博客所写的,如”编写一个最简单的操作系统“,”编写一个基本的Boot Loader“之类的内容绝大多数都只是完成了一个Boot sector,在裸机上啪啪打出一串字符就完了。 对于一个Boot Loader, 它的基本功能肯定是要从硬盘上读取出操作系统内核(或是用户程序),再将其搬运到内存中,最后跳转到操作系统内核。 本文中的Boot Loader是一个最简单的Boot Loader,能够从硬盘中读取到用户程序并将其放到内存中指定的位置。 参考资料 《x86汇编语言:从实模式到保护模式》:非常好的一本书,详细地介绍了X86汇编语言。在编写一个Boot loader之前所需了解的知识

汇编语言第七、八章总结

无人久伴 提交于 2020-01-10 01:45:29
and和or指令 1. and指令——逻辑与指令,按位进行与运算,通过该指令可将操作对象的相应位设为0,其他位不变 2. or指令——逻辑或指令,按位进行或运算,通过该指令可将操作对象的相应位设为1,其他位不变 以字符形式给出的数据 1. 以“...”的方式指明数据是以字符的形式给出的,编译器把它们转化为相应的ASCII码 大小写转换的问题 1. 大写字母+20H=小写字母;小写字母-20H=大写字母 2. and al,11011111B 可将小写字母变为大写字母;or al,00100000B 可将大写字母变为小写字母 [bx+idata] 1. 表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata) si和di 1. 是和bx功能相近的寄存器,但是si和di不能够分成两个8位寄存器来使用 [bx+si]和[bx+di] 1. [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值) [bx+si+idata]和[bx+di+idata] 1. [bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata(即bx中的数值加上si中的数值再加上idata) ( 一般来说,在需要暂存数据的时候,我们都应该使用栈 ) bx、si、di和bp 1. 只有这四个寄存器可以用在[...

IA-32汇编语言笔记(15)—— intel风格全汇编示例(软件实验部分)

戏子无情 提交于 2020-01-09 00:58:51
记录汇编语言课笔记,可能有不正确的地方,欢迎指出 教材《80X86微机原理及接口技术实验指导书》 这篇文章是书中部分 软件实验代码 的总结,可以用Tdpit 环境编译并运行在配套实验箱中( 本文中给出的软件实验代码实际上不需要实验箱的硬件资源 ),这个环境支持比较标准的intel风格汇编,我估计在masm编译器中也能便宜运行。 下一篇文章将给出一些硬件实验的示例 后面我会发一些基于nasm编译器的全汇编代码,nasm也支持intel风格全汇编,但是在语法上稍微有点区别,将来发出来后可以和这里的代码对比看 nasm和masm的区别 文章目录 一、软件实验 1. 四则运算 (1)实验要求 (2)原理提要 (3)代码示例 2. 数据统计 (1)实验任务 (2)参考代码 3. 代码转换 (1)实验任务 (2)原理提要 (3)参考代码 一、软件实验 实验中所使用DOS 功能调用( INT 21H )说明如下 2号功能:显示单个字符输出 入口:AH=02H 调用参数:DL= 输出字符 9号功能:显示字符串 入口:AH=09H 调用参数:DS:DX= 串地址,’$'为结束字符 10号功能:键盘输入 入口:AH=0 A H 调用参数:DS:DX= 输入缓冲区地址, 首字节为缓冲区字节长度,第二字节为实际输入的字符计数 4ch号功能:返回 DOS 系统 入口:AH=4CH 调用参数:AL= 返回码

微架构、指令集架构与汇编语言的关系

和自甴很熟 提交于 2020-01-06 18:57:43
最近老是碰到x86 IA32 MIPS什么的对应的汇编又是有好几种,感觉很迷。遂查资料理清这些个概念如下(大部分内容来自维基百科,如有错误谢指正!) 微架构、指令集架构和汇编语言这三者的关系大概是这样的,我们分别来介绍下 指令集 指令就是要计算机执行某种操作的命令。 从计算机组成的层次结构来说 指令分为微指令(微程序级的指令,属硬件)、宏指令(若干机器指令组成的 属软件)和机器指令(二者之间 简称指令)。 我们这里只讨论机器指令,每一条机器指令指令可以完成一个独立的算术运算或逻辑运算操作(如加减移位等)。 一台计算机中所有机器指令的集合指令集。它存在于CPU内部,对CPU运算进行指导和优化。 从指令集来说,计算机分为我们熟悉的 CISC(复杂指令集计算机)和 RISC(精简指令集计算机)。这两种的设计理念和优缺点各不相同,这里不再展开。 微架构 微架构,是处理器核心的实现方式,是 将一种给定的指令集架构在处理器中执行的方法(指令集的实现)。 通常认为只有具备独立的微架构研发能力的企业才算具备了CPU研发能力。 指令集架构(处理器架构) 是计算机体系结构中与程序设计有关的部分,包含了基本数据类型,指令集,寄存器,寻址模式,存储体系,中断,异常处理以及外部I/O。指令集架构为汇编语言的设计师和编译器所见。 几种常见的架构(详细内容和异同网上的介绍很多) x86 的32位 -> IA32

汇编语言---GCC内联汇编

我怕爱的太早我们不能终老 提交于 2020-01-05 09:57:48
GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编); 一、基本内联汇编 GCC中基本的内联汇编非常易懂, 格式如下 : __asm__ [__volatile__] ("instruction list"); 其中, 1.__asm__ : 它是GCC定义的关键字 asm 的宏定义(#define __asm__ asm),它用来声明一个内联汇编表达式,所以,任何一个内联汇编表达式都以它开头,它是必不可少的;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__asm__; 2.__volatile__ : 它是GCC关键字 volatile 的宏定义;这个选项是可选的;它向GCC声明"不要动我所写的instruction list,我需要原封不动地保留每一条指令";如果不使用__volatile__,则当你使用了优化选项-O进行优化编译时,GCC将会根据自己的判断来决定是否将这个内联汇编表达式中的指令优化掉;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__volatile__; 3.instruction list : 它是汇编指令列表;它可以是空列表,比如:__asm__ __volatile__("");或__asm__("");都是合法的内联汇编表达式

汇编语言实现led灯的跑马灯

眉间皱痕 提交于 2020-01-05 02:00:29
led实验 1.看原理图 看设备工作的原理(可能需要阅读芯片手册),看设备与cpu的连接关系 GPIO具有输入输出功能。 输入:cpu想知道io引脚是高电平还是低电平那么就是输入方式 输出:cpu想控制io引脚为高电平还是低电平那么就是输出方式 跟电流的方向没有任何关系 2. cpu的相关章节 GPJ2CON control是配置这个引脚是什么功能 GPJ2有8个引脚,每个引脚由con寄存器中的4个位进行配置 GPJ2DAT 如果cpu要输出高电平或者低电平,就需要设置该寄存器,只有8位有效 When the port is configured as input port, the corresponding bit is the pin state. When the port is configured as output port, the pin state is the same as the corresponding bit. When the port is configured as functional pin, the undefined value will be read. 当配置为输入模式的时候,dat寄存器中的某一位的值由引脚设置,引脚是高电平是,对应的位为1,引脚为低电平时,对应的位为0 当配置为输出模式的时候,dat寄存器中的某一位控制引脚的电平

汇编语言——寄存器(CPU的工作原理 ax,bx,cx,dx通用寄存器 cs代码段寄存器)

…衆ロ難τιáo~ 提交于 2020-01-02 06:22:20
寄存器 一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。(外部总线是上一篇博客说的内存总线,数据总线,控制总线) 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板上其它器件的联系。 CPU中主要的部件是寄存器,寄存器是CPU中我们可以使用指令读写的部件(通过改变各种寄存器的内容来实现对CPU的控制) 不同的CPU寄存器的个数也不同,8086CPU有14个寄存器 它们的名称为:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 1、通用寄存器 a.简介 8086CPU所有的寄存器都是16位的,可以存放两个字节。(1Byte=8bit) AX、BX、CX、DX 通常用来存放一般性数据被称为 通用寄存器。 一个16位寄存器所能存储的数据的最大值为: 2 16 -1 。 示例: 数据:20000 二进制表示:0100111000100000 在寄存器AX中的存储: 四个寄存器都可以分为 两个独立的8位寄存器 使用。 AX可以分为AH和AL; BX可以分为BH和BL;CX可以分为CH和CL; DX可以分为DH和DL。 AX的低8位(0位~7位)构成了 AL寄存器 ,高8位(8位~15位)构成了 AH寄存器 ,它们都是可以独立使用的8位寄存器。一个8位寄存器所能存储的数据的最大值是2 8 -1。 b.汇编指令

汇编语言第二章知识梳理及思考

蓝咒 提交于 2020-01-02 06:18:22
第二章 寄存器(CPU工作原理) CPU概述 CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。 内部总线实现CPU内部各个器件之间的联系。 外部总线实现CPU和主板上其他器件的联系。 寄存器概述 8086CPU有14个寄存器: AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。 2.1通用寄存器 8086CPU所有的寄存器都是16位的,可以存放两个字节。 通用寄存器:AX、BX、CX、DX通常用来存放一般性数据。 以AX为例,寄存器的逻辑结构: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 16位数据在寄存器中的存放情况 数据:18 二进制表示:10010 在寄存器AX中的存储: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0(AX) 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 一个16位的寄存器所能存储的数据的最大值为2^16-1 一个8位的寄存器所能存储的数据的最大值为2^8-1 为了保证兼容性,四个通用寄存器都可以分为两个独立的8位寄存器使用。 AX=AH(高8位(8~15位))+AL(低8位(0~7位)); BX=BH+BL; CX=CH+CL; DX=DH+DL; 2.2字在寄存器中的存储 一个字可存放在一个十六位的寄存器中

[书]x86汇编语言:从实模式到保护模式 -- 第11章 进入保护模式,初识全局描述符表GDT

為{幸葍}努か 提交于 2020-01-01 22:26:23
进入保护模式;初始化全局描述符表,通过GDT进入代码段、数据段、堆栈段 ; FILE: c11_mbr.asm ; DATE: 20191229 ; TITLE: 硬盘主引导扇区代码 ; 设置堆栈段和栈指针 ; 0x07c00以此为界限,mbr代码段cs:ip向上,mbr堆栈段ss:sp向下 mov ax, cs mov ss, ax mov sp, 0x7c00 ; 计算gdt所在的逻辑段地址 ; 32位忽略高位0,折算为20位,即ds:bx形式(ds*16 + bx) mov ax, [cs:gdt_base + 0x7c00] ; 低16位 mov dx, [cs:gdt_base + 0x7c00 + 2] ; 高16位 mov bx, 16 div bx mov ds, ax ; 商为逻辑段地址 mov bx, dx ; 余数为偏移地址 ; 创建gdt第#0号描述符 ; 处理器规定,gdt中第一个描述符必须是空描述符 mov dword [bx], 0x00000000 mov dword [bx+0x04], 0 ; 创建gdt第#1号描述符,保护模式下的代码段描述符 ; 该段:线性基地址为0x0000 7c00,段界限为0x0 01FF(即段长512字节),粒度为字节(G=0) ; 属于存储器的段(S=1),是32位的段(D=1),目前位于内存中(P=1)