下篇主要是临考试的挣扎,挑了一些觉得可能会考的用来押题,希望全都考到

孩子哭了,汇编一定要好好学啊

选择题:

例一:下列语句没错的是:

MOV AL,050AH

MOV [SI],0AH

MOV DS,100H

MOV CS,[SI]

MOV DS,ES

答:都有错,这题不选(

第一句中,AL表示字节,而050AH单位为字,目的操作数与源操作数的类型不一,故错。

第二句中,存储器单元与立即数同时作为操作数,但是没有显式指明类型,故错

更正:MOV BYTE PTR [SI],0AH (字节操作)

第三句中,立即数不能直接送到段寄存器中,故错。

第四句中,CS是专用寄存器,碰不得

第五句中,段寄存器之间不能相互传递,故错。

例二:下列语句等值的是:

简答题:

例一:解释TEST和AND指令的异同,并说明其使用注意点

答:相同点:TEST和AND指令属于逻辑运算指令,对两个操作数进行按位的逻辑与运算,且均设置CF=OF=0,对AF无定义。

​ 不同点:AND指令会将逻辑与的结果送给目的操作数,而TEST指令不会。

举一反三.1:解释TEST和CMP指令的异同

答:相同点:TEST指令和CMP指令都不会将结果送回给操作数,只修改标志位。

​ test逻辑与(AND)运算结果为零,就把ZF(零标志)置1;

​ cmp 算术减法运算(SUB)结果为零,就把ZF(零标志)置1.

​ 不同点:TEST指令是逻辑运算符,对两个操作数进行按位的逻辑与运算,

​ 而CMP指令是算术运算指令,将目的操作数减去源操作数(后减前)

例二:画图并解释说明MOV指令在立即数、通用寄存器、段寄存器和存储器之间可能转移关系,并写出将立即数0102H放入DS寄存器的代码

答:

MOV AX,0102H

MOV DS,AX

解释说明:

1.立即数到存储器和寄存器都是单向的

2.立即数不能直接到段寄存器,需要通过寄存器中转

3.寄存器之间可以互相mov

4.段寄存器之间不能互相传递

5.存储器之间不能相互传递

举一反三.2:写出交换将BUF1段中的数据和BUF2段中数据的代码

答:

MOV AX,BUF1

MOV DX,BUF2

MOV BUF2,AX

MOV BUF1,DX

例三:8086有多少种存储器寻址方式?写出相对基址变址寻址方式的公式并解释何为变址。

答:一共有五种

分别为:

1.直接寻址 :MOV AX,[2077H]

2.寄存器间接寻址 :MOV AX,[SI]

3.寄存器相对寻址:MOV AX,[SI+06H]

4.基址变址寻址方式:MOV AX,[BX+SI]

5.相对基址变址寻址:MOV AX,[BX+SI+06H]

解释:基址是指基址寄存器(BX/BP),变址是指变址寄存器(SI/DI)

相对基址变址寻址,即使用基址寄存器和变址寄存器,再加上一个8/16位的位移量(即为相对)这三者之和构成操作数的有效地址EA

例四:什么是8086中的逻辑地址和物理地址?逻辑地址如何转换成物理地址 ?

答:”段地址:偏移地址“被称为逻辑地址。其中段地址说明逻辑段在主存中的起始位置,偏移地址说明主存单元距离段起始位置的偏移量。

物理地址:在8086中,每个存储器单元都有一个20位的地址,被称为 单元的物理地址,也为实际地址。(默认要补齐5位)如图

例五:编写定义缓冲区,及实现输入字符串的核心代码

答:string db 'Im a string',0dh,0ah,'$'

buffer db 81

         `db ?`

         `db 81 dup(0)`

mov dx,seg buffer

mov ds,dx

mov ah,0ah

mov dx,offset buffer

int 21h

编程题

例一:编写一个程序,要求能从键盘接收一个个位数N,然后响铃N 次(响铃的ASCII 码为07)

分析:采用字符串输入功能接受一个数,传入CX中,再调用输出字符功能,输出直到CX为0

代码如下:

.model small

.stack

.data

.code

.startup

mov ah,01h

int 21h

sub al,30h

mov cl,al

mov ah,02h

mov dl,0ah

int 21h

again:

cmp cl,0

jz over

mov ah,02h

mov dl,07h

int 21h

mov dl,'1'

int 21h

dec cl

jmp again

over: .exit 0

end

例二:实现字符串的冒泡排序

分析:使用两层循环,结合跳转实现

代码如下:

结语

明天上刑场

概统还没复习

高星救我