汇编语言 微机原理与接口技术
发布时间:2025-05-20 20:00:53 发布人:远客网络
一、汇编语言 微机原理与接口技术
5.在8086CPU系统中,设某中断源的中断类型码为08H,中断矢量为0100H:1000H,则相应的中断矢量存储地址为_20H_;从该地址开始,连续的4个存储单元存放的内容依次为_00H 01H 00H 10H__。
6.堆栈是内存中一个专用区域,其存取规则是__先进后出__;在8086系统中,当CPU响应外部中断请求转向中断处理程序前,应将_PSW、CS、IP_的内容依次压入堆栈。
8、MOV AX,[BX+DI+250H]的寻址方式为相对基址变址寻址。
9、半导体存储器中,RAM指的是_随机访问存储器_断电后信息一般会_丢失__在微机主板上有一块ROM芯片,存放的基本输入输出系统称为__BIOS_,常用的6264芯片属于_RAM_容量为 __8K*8位_。
11.已知[X]补=81H,真值X=-127、[X]原=0FFH、[X]反=80H。
12.若AL=41H,问若是无符号数,它代表_65_,若是有符号数,它代表_65_,若是BCD码,它代表_41_,若是ASCII码,它代表_A_。
13.段寄存器CS存放的内容是_代码段的段地址_,由获得代码段起始地址的方式为 __CS*10H__。
14.8086CPU中,ALE引脚是_地址锁存_信号。
17.指令ADD [BX+DI],CX源操作数的寻址方式是__寄存器寻址__,目的操作数的寻址方式是__基址变址寻址_。
18.已知下列指令执行前,CS=2000H,IP=1000H, SI=2000H,写出下列无条件指令执行后CS和IP值。
(1)EBF4 JMP SHORT L1 CS=2000H,IP=。
(2)E3 JMP SI CS=2000H,IP=2000H。
19.8259A工作方式中,优先级方式包括_全嵌套方式_,_特殊全嵌套方式_,_优先级自动循环方式__和_优先级特殊循环方式__四种。
20.当8255A的PC4—PC7全部为输出线,表明8255A的A端口工作方式是方式0。
21.组成32M×8位的存储器,需要1M×4位的存储芯片64片。
22、8088/8086CPU的标志位寄存器中有 9个标志位,其中的3个是控制标志,_6个_是状态标志。
24、8088/8086CPU的存储器采用分段方式管理,每个段最多可以有_64K_字节,全部存储空间可以分成_16_个大小为64K且互相不重叠的段。
27、对于8086微机系统,上电后CPU要自动初始化。初始化后,CS为_FFFFH_,IP为_0000H_,8086执行的第一条指令在__FFFF0H__单元里存放。
30、中断类型NMI、INTR、除法溢出、INTN和单步中断的优先级顺序为(由高到低)。
31、若中断类型号为23H,则存放中断向量的存储单元的起始地址为__8CH_。
二、指令集和汇编语言的联系
1.现代操作系统绝大多数代码都是用C语言写的,只有少量直接和硬件打交道的代码是用汇编语言写的。把操作系统源代码转换成cpu对应的机器码(指令)那是编译器和汇编器的事。
2.至于你问“利用指令集吗?”,我就不懂了。你不运行指令,怎么操纵cpu呢?你运行的指令当然就是指令集里的指令了,否则cpu也不认识啊,是不是?
3.指令和汇编语言有什么联系那是汇编器的事情。汇编语言是一类编程语言,而cpu能执行的只有指令,汇编语言通过汇编器的编译能生成指令(机器码)。问这个问题和问“C语言和exe文件有联系吗”答案是一样的。当然,不同的汇编器规定的汇编语言的格式不同。就拿intel80x86来说,
cmp dword ptr [ebp-8],0(microsoft格式)和cmpl$0,-8[%ebp](Gnu格式)
两句就是按照不同的汇编器规定的格式写的,但是他们在对应的汇编器上生成的机器码(指令)是一样的。也许哪一天我做了一个汇编器,就又有了一种别的格式的汇编语言呢。
4.操作系统的API是操作系统提供给用户的编程接口,是操作系统的一部分,什么叫“和指令集有联系?”。我认为这个问题和2中所问的是同一个问题
以上是我的回答,不知有没有说清楚……
三、如何快速看懂汇编语言程序
1、首先得了解汇编指令吧,其次得用机器的逻辑思考问题,明白其中的存储、累加、判断、转移等概念。
2、比如,1+2+....+100这样的问题,虽然我们可以给出公式计算,但机器并不知道,它只能知道,而且只能每次做一个加法,而且鉴于CPU的架构不能存所有的这些数值-如果这些数量不定的话更复杂,比如这些数是放在一个内存区域的,内存区域约定如下:第一个数表示总共有多少个数,后面是相应的数据,在这些数没有规律时是不能用公式的。
3、另外,许多CPU约定只有一个累加器(同时也是一个寄存器,假设它是寄存器AX),它允许从内存读一个数(MOV或者LD指令),只能进行内存数据加法(ADD [地址])。
4、于是我们只能这样,首先设置指针寄存器BX:
5、start: mov BX,#地址;设置内存区域起始地址,保存在BX中
6、 mov CX,[BX];取出总数到CX中,假设CX可以做简单递增或递减
7、 dec CX;预减一次计数器,因为加法只需做CX-1次
8、loop: inc BX;递增BX,使之指向真实数据
9、 ADD AX,[BX];用下一数据进行累加,并将结果保存在AX中
10、 dec CX;假定这个减法会影响标志位ZF
11、 JNZ loop;如果没有减到0就继续loop到这里之间的操作
12、 mov [BX], AX;保存累加结果到数据区的尾部
13、可以看出,上述代码并不能告诉我具体结果是多少,除非我们通过工具去访问这一内存区域,于是一个系统会设计出来专门让我们进行基本的输入输出,把计算机的内部情况甚至内存情况通过I/O口送出来,这些IO设备,比如键盘负责接收我们的机器指令(可以是汇编结果,也可以是高级语言产生的二进制指令和数据流),把结果输出到打印机或者CRT这样的输出设备上(通常映射为端口,IO PORT)。这就是BIOS完成的工作,如int 8负责时钟,int 10负责屏幕,int 16负责键盘等等。更进一步,可以进一步封装称DOS调用,如int 21负责基本的输入输出包括文件操作等等。WINDOWS等操作系统则通过驱动层进行多级抽象提供操作界面给编程人员,编程人员再进一步封装出对话框或全屏文字菜单或流式(行式操作)操作界面给最终用户。