第一章:
5.在ASCⅡ
,字符“0”~“9”之间编码规律是什么?大写字母和小写字母之间的编码规律是什么?
答:在ASCⅡ表中,字符“0”~“9”的编码是连续的,且“0”的ASCⅡ编码为30H。英文字母在ASCⅡ码中的编码也是连续的,大写字母的编码小于小写字母的编码,且大小写字母的编码之间相差20H.
第2章:
5.IP/EIP寄存器的用途是什么?它是“计算机组成原理”课中的什么概念在CPU中的具体体现?
答:IP和EIP分别是16位和32位的寄存器,它们存放着下次将要执行的指令在代码段的偏移量。它们是“计算机组成原理”中的指令“下条指令”地址的指令地址寄存器在CPU中的具体体现。
9.假设用以下寄存器组合来访问存储单元,试分别求出它们所访问单元的物理地址。
答:1。DS=1000H和DI=2000H;
2.DS=2000H和SI=1002H;
3.SS=2300H和BP=3200H;
4.DS=0A000H和BX=1000H;
5.SS=2900H和SP=3A00H。
第3章:
4.判断下列各种操作数的寻址方式的正确性,正确的指出其寻址方式,错误的说明其错误原因:
1.[AX] 错误,AX不能用于访问内存单元。
2.[EAX] 正确,32位地址的寻址方式。
3.BP 正确,寄存器寻址方式。
4.[SI+DI] 错误,两个变址寄存器SI和DI不能同时用于内存单元的有效地址。
5.DS 正确,寄存器寻址方式。
6.BH 正确,寄存器寻址方式。
7.[BX+BP+32] 错误,两基址寄存器BX和BP不能同时用于内存单元的有效地址。
8.[BL+44] 错误,寄存器BL不能用于表示内存单元的有效地址。
9.[CX+90] 错误,寄存器CX不能用于表示内存单元有效地址。
10.EDX 正确,寄存器寻址方式。
11.BX+90H 错误,无此寻址方式或非法的表达式。
12.[DX] 错误,寄存器DX不能用于表示内存单元的有效地址。
13.SI[100H] 错误,书写方式不正确。
14.[BX*4] 错误,16位寄存器不能乘比例因子。
15.[EAX+EBX*6] 错误,32位地址寻址方式的比例因子错。
16.[DX+90H] 错误,寄存器DX不能用于表示内存单元的有效地址。
第5章:
2.简述指令MOV BX,1234H,MOV BX,[1234]和MOV BX, OFFSET[1234H]的功能和它们之间的区别?
答: 1.MOV BX,1234H的作用是将通用寄存器BX的当前值设为1234H;
2.MOV BX,[1234]的作用是取出内存地址1234H的当前值赋予通用寄存器BX;
3.MOV BX, OFFSET [1234H]的作用是取内存地址1234H的偏移量,而地址[1234H]的偏移量就是1234H,所以,指令的执行效果就是把1234H赋予寄存器BX。
3.简述指令MOV BX,DATA和MOV BX, OFFSET DATA 之间的区别。
答:1.MOV BX, DATA的作用是将DATA 的值赋予通用寄存器BX。
2.MOV BX, OFFSET DATA 的作用是将DATA的偏移地址赋予寄存器BX。
第6章:
6.假设有3个无符号字存放在以BUFFER 为开始的缓冲区中,编写一个程序把它们从低到高排序。
答:
buffer dw 3 dup (?)
mov ax , buffer
mov bx , buffer[2]
mov cx , buffer[4]
cmp ax , bx
jbe next1
xchg ax,bx
next1:
cmp bx, cx
jbe next2
xchg bx,cx
next2:
cmp ax, bx
jbe next3
xchg ax, bx
next3:
mov buffer , ax
mov buffer[2] , bx
mov buffer[4] , cx
12.假设从变量BUFF开始存放了200个字,编写一个程序统计出其整数,0和负数的个数,并把它们分别存入N1,N2和N3中。
答:
Buff dw 200 dup(?)
N1 dw 0
N2 dw 0
N3 dw 0
…
Mov cx , 200
Mov si ,0
Next4:
Mov ax , word ptr buff [si]
Add si , 2
Cmp ax, 0
Je next1
Jg next2
Mov bx, offset n3
Jnc word ptr [bx]
Jmp next3
Next1:
Mov bx, offset n2
Inc word prt[bx]
Jmp next3
Next2:
Mov bx , offset n1
Inc word prt [bx]
Next3:
Loop next4
第7章:
3.简述调用指令CALL和转移指令JMP之间的主要区别。
答:CALL指令是一种特殊的转移操作。当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,CALL指令含有转移指令的功能。JMP转移指令是一种“一去不复返”的操作,而当子程序执行结束后,还要求CPU能转而执行CALL指令后续的指令,它是一种“有去有回”的操作。
4.简述段内和段间子程序调用指令CALL的主要区别。
答:子程序的调用指令分为近(NEAR)调用和远(FAR)调用。近调用即段内子程序调用,远调用即段间子程序调用。
如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移。
如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作。
13.调用子程序指令CALL和调用伪指令INVOKE的主要区别是什么?
答:INVOKE伪指令是调用基于堆栈的子程序方法,它把所有参数压栈,子程序结束时,又把参数自动弹出堆栈。在参数传递时,汇编程序将根据子程序的原型进行数据类型检查。若需要进行参数类型转换的话,汇编程序则会自动生成一段代码来满足其数据类型转换的要求。而CALL指令只负责调用子程序,并不对参数进行处理。
21.用WHILE和.ENDW语句实现19,20
的功能。
答:将19题用.WHILE和.ENDW语句实现:
Search proc
.while byte ptr[si]!=0
.break . if [si]= = a1
Inc si
.endw
.if [si]= = a1
Stc
.else
Clc
.endif
Ret
Search endp
将20题用.WHILE和.ENDW语句实现:
Fill proc
.while cx!= 0
Mov byte ptr[si] , 0
Inc si
Dec cx
.endw
Ret
Fill endp
第八章:
1.简述中断和子程序调用之间的主要区别。
答:中断和子程序调用在实现方面的主要差异:
1.子程序调用一定是程序员在编写源程序时事先安排好的,是可知的,而中断是由中断源根据自身的需要产生的,是不可预见的(用指令INT引起的中断除外)。
2.子程序调用是用CALL指令来实现的,但没有调用中断的指令,只有发出中断请求的事件(指令INT是发出内部中断信号,而不要理解为调用中断服务程序)。
3.子程序的返回指令是RET,而中断服务程序的返回指令是IRET/IRETD;
4.在通常情况下,子程序是由系统的开放者编写的,而中断服务程序是由系统软件
者编写的。
2.为什么要区分IRET指令与RET指令?
答:响应中断的过程是先保护现场和返回地址的,然后再进入中断响应程序的运行。现场包括通用寄存器和标志位寄存器的内容,而调用子程序一般有用户自己来保护特定的寄存器,通常不保护标志位寄存器。由于保护内容的不同,在返回时,从堆栈中弹出的内容也就不同。所以为了区别返回指令的功能,需要分别设置中断返回指令IRET指令和子程序返回RET指令。
3.编写一个子程序,它显示以0结尾的字符串。子程序的入口参数DS:DX为待输出字符串的首地址。
答:
Display proc uses ax bx ;子句USES在MASM6。X中有效, next:
Mov bx ,dx
Mov d1 ,byte prt [bx]
Cmp d1 , 0
Je finish
Mov ah ,2
Int 21h
Inc bx
Jmp next
Finish :
Ret
Dispiay endp