7.已知数据段定义如下:
DSEG SEGMENT
ORG 6 VAR1 DB 2,18
ORG $ +2 VAR2 DW 569AH CONT EQU $–VAR2
DB ?AB‘
DSEG
ENDS
用示意图说明该数据段的分配情况。 答:有关存储单元的内容如下图所示。
8.判断以下说法是否正确,如有错,请说明原因并改正。 (1)伪指令在汇编过程中不会产生二进制代码。
(2)宏和过程的相同之处是都可用于简化源程序书写、精简目标代码。 (3)在计算机中,高级语言通常需要转换为汇编语言后才能执行。 (4)汇编语言程序上机一般包括编辑、汇编、链接和调试几个步骤。 答:(1)正确。 (2)错误。宏不能精简目标代码。 (3)错误。高级语言程序经编译或解释后直接转换为目标代码。 (4)正确。
9.执行下列指令后,AX寄存器中的内容是什么?
TABLE DW 10,20,30,40,50
ENTRY DW 3 . .
MOV BX,OFFSET TABLE ADD MOV
10.指出下列程序中的错误: STAKSG SEGMENT
DB 100 DUP(?)
STA_SG ENDS DTSEG SEGMENT
20
BX,ENTRY AX,[BX]
答:(AX)=1E00H
DATA1 DB ?
DTSEG END CDSEG SEGMENT
MAIN
PROC MOV ADD MOV
FAR DS,DATSEG AL,34H AL,4FH DATA,AL
START: MOV
START ENDP CDSEG ENDS
END 答案: 改正后:
STAKSG SEGMENT DB 100 DUP(?) STAKSG ENDS DTSEG SEGMENT DATA DB ? DTSEG ENDS CDSEG SEGMENT MAIN PROC FAR ASSUME CS: CDSEG, DS: DTSEG, SS: STAKSG START: MOV AX, DTSEG MOV DS, AX MOV AL, 34H ADD AL, 4FH MOV DATA1, AL MOV AH, 4CH INT 21H MAIN ENDP CDSEG ENDS END START
11.请写出上述两条指令执行后,BX寄存器中的内容。
DATA DATA
┆
MOV LEA
BX, TABLE_ADDR BX, TABLE_ADDR SEGMENT
DW 1234H
ENDS TABLE_ADDR
答案: MOV BX,TABLE_ADDR ;执行后(BX)=1234H
LEA BX,TABLE_ADDR ;执行后(BX)=OFFSET TABLE_ADDR
21
12.读下面程序,在其中的空处添上适当内容。该程序完成了什么功能?程序运行后,变量RS的值是多少?
DATA
BUF
RS DATA STACK
STACK CODE START
SEGMENT
DB -13,24,5,-62 DB 77,20,-7,145,0 DB 0 ENDS
SEGMENT PARA STACK DB 256 DUP(?) ENDS SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACK PROC PUSH MOV PUSH MOV MOV MOV MOV TEST JE
INC LOOP RET ENDP ENDS END
START FAR DS AX,0 AX AX,DATA DS,AX CH,0 CL, AL,[BX] AL,80H CONT RS BX LP
CNT DB $ -BUF
LEA BX,BUF
LP: MOV
CONT: INC
START CODE
答:程序空处可填CNT,字节变量RS的最后结果是04H。该程序实现的功能是:统计数据段中以BUF为首址的带符号字节数据表中负数的个数,CNT为表中所有数据的个数,即表的长度。需要注意的是:十进制数据―145‖在以二进制带符号字节数据形式存放时相当于―-111‖。
13.试编写一个汇编语言程序段,要求对键盘输入的小写字母用大写字母显示出来。
22
答案: abc: mov
int cmp jb cmp ja
sub mov mov int jmp
ah,1 21h al,‘a‘ stop al,‘z‘ stop al,20h dl,al ah,2 21h abc
stop: ret
14.编写程序,比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示―MATCH‖,若不同则显示―NO MATCH‖。
答案:datarea segment
string1 db ?asfioa‘ string2 db ?xcviyoaf‘ mess1 mess2
db ?MATCH‘,‘$‘ db ?NO MATCH‘,‘$‘
datarea ends prognam segment main
start:
proc far
assume cs:prognam,ds:datarea push ds sub ax,ax push ax mov ds,ax mov es,ax
begin:
;赋初值
mov cx, string2-string1 mov bx, mess1-string2 cmp bx,cx jnz dispno lea lea
;返回DOS
mov ax,datarea
;比较两字符串的长度
dx,addr ;若长度相同 si,string1
23
lea repe jne mov lea int ret
di,string2 ;地址指针赋初值 cmpsb dispno ah,9 dx,mess1 21h
;不同,显示NO MATCH
;相同,显示MATCH
;比较
dispno: mov ah, 9
lea int ret
main
endp end
start
prognam ends
21h
dx, mess2
15.编写一个完整的源程序,将数据35、-27、-13、6、-47、52、9、-3中的正数放入以BUFFER为首址的数据缓冲区中。
答:一种可能的程序如下实现:
DATA SEGMENT BLOCK DB 35,-27,-13,6,-47,52,9,-3 COUNT EQU $-BLOCK BUFFER DB COUNT DUP(?)
DATA ENDS
STACK SEGMENT PARA STACK?STACK‘ DW 40 DUP(?)
STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX MOV ES,AX ;需用STOS串操作指令 MOV CX,COUNT LEA SI,BLOCK ;源数据区指针 LEA DI,BUFFER ;正数存放区指针 CLD ;自动增量 AGAIN: LODSB ;取源数据,并修改SI TEST AL,80H ;取符号位,不影响AL JS GO ;符号位=1,是负数,不存 STOSB ;存正数并修改DI GO: LOOP AGAIN MOV AH,4CH ;退出循环,返回DOS INT 21H CODE ENDS END BEGIN
16.从内存单元BUF开始的缓冲区中有7个8位无符号数,依次为13H、
24