汇编语言总复习(下)
下篇主要是临考试的挣扎,挑了一些觉得可能会考的用来押题,希望全都考到
孩子哭了,汇编一定要好好学啊
选择题:
例一:下列语句没错的是:
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
例二:实现字符串的冒泡排序
分析:使用两层循环,结合跳转实现
代码如下:
结语
明天上刑场
概统还没复习
高星救我