随笔分类 - 汇编语言
摘要:引言 大多数有用的程序都需要处理用户的输入,键盘输入是最基本的输入 程序和数据通常需要长期存储,磁盘是最常用的存储设备 BIOS为这两种外设的I/O提供了最基本的中断例程, 我们已经讲过,键盘输入将引发9号中断,BIOS提供了int 9中断例程。 cpu在9号中断发生后,执行 int 9中断例程,从
阅读全文
摘要:引言 这一章,我们讨论如何有效合理地组织数据,以及相关地编程技术。 本章中,我们要用到这种标号,先进行如下介绍 前面地课程中,我们一直在代码段中使用标号来标记指令、数据、段的起始地址。 比如:下面的程序将code段中的a标号处的8个数据累加,结果存储到b标号处的字中。 程序中,code、a、b、st
阅读全文
摘要:引言 以前我们讨论的都是cpu对指令的执行。我们知道,cpu在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接受他们的输入,向他们进行输出。 也就是说,cpu除了有运算能力外,还要有I/O能力。 15.1接口芯片和端口 第14章我们讲过,在pc系统的接口卡和主板上,装有
阅读全文
摘要:cpui可以直接读写3个地方的数据 1)cpu内部的寄存器 2)内存单元 3)端口 这一章,我们讨论端口的读写 对端口的读写不能用mov、push、pop等内存读写指令。 端口的学些指令只有两条: in和out 分别用于从端口读取数据和往端口写入数据。 访问端口: in al,60h;从60h号端口
阅读全文
摘要:引言 中断信息可以来自cpu的内部和外部,当cpu的内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。 13.1 int指令 int格式:int n,n为中断类型码,它的功能是引发中断过程。 cpu执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下: 1)取
阅读全文
摘要:引言: 中断的意思是指,cpu不再接着(刚执行完的指令)向下执行,而是转去处理这个特殊信息。 注意,我们这里所说的中断信息,是为了便于理解而采用的某种逻辑上的说法。它是对几个具有先后顺序的硬件操作所产生的事件的统一描述。 当cpu的内部有什么事情发生的时候,将产生需要马上处理的中断信息呢? 对于80
阅读全文
摘要:同add、sub指令一样,cpu在执行cmp指令的时候,也包含两种含义:进行无符号数运算和进行有符号数运算。 所以利用cmp指令可以对无符号数进行比较,也可以对有符号数进行比较。 下面我们来看以下如果用cmp来进行有符号数比较时,cpu用哪些标志位对比较结果进行记录。 我们以cmp ah,bh为例进
阅读全文
摘要:8086cpu的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。 我们已经使用过8086cpu的ax、bx、cx、dx、si、di、bp、sp、ip、cs、ss、ds、es等13个寄存器了。 本章中的标志寄存器(以下简称flag)是我们要学习的最后一个寄存器。 flag和其他寄存器
阅读全文
摘要:引言: call和ret都是转移指令,他们都修改ip,或同时修改cs和ip。 他们经常被共同用来实现程序的设计 10.1 ret和retf ret指令用栈中的数据,修改ip的内容,从而实现近转移。 retf指令用栈中的数据,修改cs和ip的内容,从而实现远转移; 可以看出,如果我们用汇编语法来解释r
阅读全文
摘要:9.7jcxz指令 jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对ip的修改范围都为-128~127 指令格式:jcxz 标号 (如果cx=0,则转移到标号处执行) jcxz 标号 指令操作: 当cx=0时,ip=ip+2位位移 8位
阅读全文
摘要:8086cpu的转移指令分为以下几类: 无条件转移指令(如:jmp) 条件转移指令 循环指令 过程 中断 9.1 操作符0ffset 操作符offset在汇编语言中是由编译器处理的符号,他的功能是取得标号的偏移地址。 9.2 jmp指令 jmp为无条件转移,可以只修改ip,也可以同时修改cs和ip
阅读全文
摘要:8.7 div指令 div是除法指令,使用div做除法的时候: 除数:8位或16位,在寄存器或内存单元中 被除数:(默认)放在ax或dx和ax中 结果: 运算 8位 16位 商 al ax 余数 ah dx div指令格式: div reg div 内存单元 div byte ptr ds:[0]
阅读全文
摘要:本章对前面的所有内容是具有总结性的。我们知道,计算机是进行数据处理、运算的机器,那么有两个基本的问题就包含在其中: 1)处理的数据在什么地方 2)要处理的数据有多长? 这两个问题,在机器指令中必须给以明确或隐含的说明,否则计算机就无法工作。 为了描述上的简洁,在以后的课程中,我们将使用两个描述性的符
阅读全文
摘要:7.10 不同的寻址方式的灵活应用 如果我们比较一下前面用到的几种定位内存地址的方法(可称为寻址方式),就可以发现有以下几种方式: 1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元。 2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元。 3)[bx+idata]用一个
阅读全文
摘要:引言 前面,我们用[0]、[bx]的方法,在访问内存的指令中,定位内存单元的地址。 在这一章中,我们主要讲解一些更灵活的定位内存地址的方法和相关的编程方法 首先我们介绍两条指令and和or,因为我们下面的例子中要用到他们。 1)and指令:逻辑与指令,按位进行与运算。 如mov al, 011000
阅读全文
摘要:前面我们写的程序中,只有一个 代码段 现在有一个问题是: 如果程序需要用其他空间来存放数据,我们使用哪里呢? 第5章中,我们讲到要使用一段安全的空间。 我们说0:200~0:300是相对安全的 可是这段空间的容量只有256个字节,如果我们需要的空间超过256个字节,该怎么办呢? 下面我们将以这样的顺
阅读全文
摘要:[bx]是什么呢? 和[0]有些类似,[0]代表内存单元,它的偏移地址是0. 我们要完整的描述一个内存单元,需要两种信息: 1)内存单元的地址 2)内存单元的长度(类型) 我们用[0]表示一个内存单元时,0表示单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(比如
阅读全文
摘要:在WIN10环境下,运行汇编程序不是很简单,当然,如果你用一些集成环境下的ide去运行汇编的话,那会非常方便,就和C/C++的编译器一样方便,但是在这里,我们主要说下,如何在dosbox下运行汇编程序,这还是稍微麻烦些的。 首先,编写你的汇编程序,你可以用记事本,也可以用notepad++等等的工具
阅读全文
摘要:一个汇编语言程序从写出到最终执行的简要过程: 编写--》编译--》连接--》执行 原程序中的程序: 汇编源程序: 伪指令(编译器处理) 汇编指令(编译为机器码) 程序:原程序中最终由计算机执行、处理的指令或数据 4.2 源程序 标号 一个标号指代了一个地址 codesg:放在segment的前面,作
阅读全文
摘要:3.6 栈 我们研究栈的角度: 栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。 栈有两个基本的操作:入栈和出栈 入栈:将一个新的元素放到栈顶 出栈:从栈顶取出一个元素 栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。 栈的操作规则:LIFO(后进先
阅读全文