4-1 假设下列指令中的所有标识符均为类型属性为字的变量,请指出下列指令中哪些是非法的?它们的错误是什么?
(1)MOV BP,AL ;非法,操作数类型不同
(2)MOV WORD_OP[BX+4*3][DI],SP ;合法
(3)MOV WORD_OP1,WORD_OP2 ;非法,不允许两个内存单元直接传递数据
(4)MOV AX,WORD_OP1[DX] ;合法
(5)MOV SAVE_WORD,DS ;合法
(6)MOV SP,SS:DATA_WORD[BX][SI] ;合法
(7)MOV [BX][SI],2 ;非法,必须有一个寄存器
(8)MOV AX,WORD_OP1+WORD_OP2 ;非法,两个内存单元地址相加没有意义
(9)MOV AX,WORD_OP1-WORD_OP2+100 ;合法
(10)MOV WORD_OP1,WORD_OP1-WORD_OP2 ;非法,不允许两个内存单元直接传递数据
4-2 画图说明下列语句所分配的存储空间及初始化的数据值.
(1)BYTE_VAR DB 'BYTE',12,-12H,3 DUP(0,?,DUP(1,2),?)
(2)WORD_VAR DW 5 DUP(0,1,2),?,-5,'BY','TE',256H
4-3 试列出各种方法,使汇编程序把5150H存入一个存储器字中(例如:DW 5150H).
(1)DW 5150H
(2)MOV AX,5150H
MOV ADDRESS,AX
等,写出几个就可以
4-4 假设程序中的数据定义如下:
PARTNO DW ?
PNAME DB 16 DUP(?)
COUNT DD ?
PLENTH EQU $-PARTNO
问PLENTH的值为多少?它表示什么意义?
[解]:PLENTH 的值为22,GE表示该数据段的长度
4-5 试写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,5和4放在10字数组DATA_LIST的头5个单元中.然后,写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中.
[解]:源程序如下.
DATA_SEG SEGMENT
DB 5
DATA_LIST DW 0FFFFH,0,2,5,4, 5 DUP (?)
MAX DW ?
MIN DW ?
DATA_SEG ENDS
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG,DS:DATA_SEG
START:
MOV AX,DATA_SEG
MOV DS,AX
MOV AX,5
MOV MAX,AX
MOV AX,0FFFFH
MOV MIN,AX
CODE_SEG ENDS
END START
4-6 对于下面的数据定义,三条MOV指令分别汇编成什么?(可用立即数方式表示)
TABLEA DW 10 DUP(?)
TABLEB DB 10 DUP(?)
TABLEC DB '1234'
......
MOV AX,LENGTH TABLEA
MOV BL,LENGTH TABLEB
MOV CL,LENGTH TABLEC
[解]:分别汇编成为:
MOV AX,0AH
MOV BL,0AH
MOV CL,1
4-7 对于下面的数据定义,各条MOV指令单独执行后,有关寄存器的内容是什么?
FLDB DB ?
TABLEA DW 20 DUP(?)
TABLEB DB 'ABCD'
(1)MOV AX,TYPE FLDB ;(AX)=1
(2)MOV AX,TYPE TABLEA ;(AX)=2
(3)MOV CX,LENGTH TABLEA ;(CX)=14H
(4)MOV DX,SIZE TABLEA ;(DX)=28H
(5)MOV CX,LENGTH TABLEB ;(CX)=1]
4-8 按下面的要求写出程序的框架.
(1)数据段的位置从0E000H开始,数据段中定义一个100字节的数组,其类型属性既是字又是字节;
(2)堆栈段从小段开始,段组名为STACK;
(3)代码段中指定段寄存器,指定主程序从1000H开始,给有关段寄存器赋值;
(4)程序结束.
[解]:程序框架如下.
DATA_SEG SEGMENT
ORG 0E000H
FIRST_TYPE EQU THIS WORD
DATA_GROUP DB 100 DUP(?)
DATA_SEG ENDS
STACK_SEG SEGMENT
ALIGN 16
STACK DB 100 DUP (?)
STACK_SEG ENDS ;
CODE_SEG SEGMENT
ASSUME CS:CODE_SEG ,DS:DATA_SEG ,SS:STACK_SEG
ORG 1000H
START:
MOV AX,DATA_SEG
MOV DS,AX
MOV AX,STACK_SEG
MOV SS,AX
.
......
CODE_SEG ENDS
END START
4-9 请说明表示程序结束的伪操作和结束程序执行的语句之间的差别.它们在源程序中应如何表示?
[解]:表示程序结束的伪操作是由系统所执行,并且在操作系统的控制下自动完成,
如:MOV AX,4C00H INT 21H等;而结束程序执行的语句除了以上这些以外,还可以是其它非正常终止的指令,如HALT,EXIT等.
4-10 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
BEGIN: MOV AH, 1
INT 21H
CMP AL, ‘a’
JB STOP
CMP AL,’z’
JA STOP
SUB AL, 20H
MOV DL, AL
MOV AH, 2
INT 21H
JMP BEGIN
STOP: RET
4-11 试编写一个程序,要求能从键盘接收一个个位数,然后响铃N次(响铃的ASC码为07)。
BEGIN: MOV AH, 1
INT 21H
AND AL, 0FH
CBW
MOV CX, AX
JCXZ EXIT
BELL: MOV DL, 07
MOV AH, 02
INT 21H
LOOP BELL
EXIT: RET
4-12 编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。
此题根据题意要求应该使用完整汇编格式,因为精简格式也使用