第四章 汇编语言源程序设计
1.画出数据段汇编后相应存储单元中的内容并标出存储单元的逻辑地址。 DATA SEGMENT ORG 0100H
ABC0 EQU 78H ABC DB 09H,-2,45H, 2 DUP(01H,?),‘AB’ ABC1 DW -2, 34H+ABC0,$ ABC2 DD 12H ABC3 DW ABC DATA ENDS 解:
DS:0100H DS:0101H DS:0102H DS:0103H DS:0104H DS:0105H DS:0106H DS:0107H DS:0108H DS:0109H DS:010AH DS:010BH DS:010CH DS:010DH DS:010EH DS:010FH DS:0110H DS:0111H DS:0112H DS:0113H DS:0114H
ABC→ ABC1→ ABC2→ ABC3→
09H FEH 45H 01H - 01H - 41H 42H FEH FFH ACH 00H 0DH 01H 12H 00H 00H 00H 00H 01H 2.设程序中的数据定义如下: PARTNO DW ? PNAME DB 16 DUP(?) COUNT DD ? PLENTH EQU $-PARTNO
问PLENTH的值为多少?它的含义是什么? 解:PLENTH的值为22(16H)。表示当前位置与PARTNO之间有22个字节空间。 3.假设程序中的数据定义如下: LNAME DB 30 DUP(?)
ADDRESS DB 30 DUP(?) CITY DB 15 DUP(?) CODE_LIST DB 1,7,8,3,2
(1)用一条MOV指令将LNAME的偏移地址放入AX; (2)用一条指令将CODE_LIST的头两个字节的内容放入SI:
(3)写一条伪操作使CODE_LENGTH的值等于CODE_LIST域的实际长度。 解:(1)MOV AX,OFFSET LNAME (2)MOV SI,WORD CODE_LIST
(3)CODE_LENGTH EQU $-CODE_LIST
4.执行下列程序段后,AX、BX的内容各是什么?
MOV AX,0001H MOV BX,8000H NEG AX MOV CX,4 AA:SHL AX,1
RCL BX,1 LOOP AA HLT
解:AX=0FFF0H,BX=000FH 5.阅读以下程序,回答问题 DATA SEGMENT
ABC DB 90H,12H,43H,56H,04H,01H
COUNT EQU $-ABC RESULT DW ? DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:PUSH DS
MOV AX,DATA
MOV DS,AX XOR AX,AX
MOV CX,COUNT LEA SI,ABC LEA DI,RESULT AA:MOV BL,[SI]
INC SI
CMP BL,80H JC NEXT1 NEG BL
NEXT1:ADD AL,BL
ADC AH,00H LOOP AA MOV [DI],AX MOV AH,4CH
INT 21H CODE ENDS
END START (1)程序完成什么功能?
(2)程序中NEG BL指令的作用是什么?
(3)程序执行结束后RESULT字单元的内容是什么?
(4)能否用MOV SI,OFFSET ABC代替程序中LEA SI,ABC指令? (5)汇编结束后符号COUNT的值是什么?
解:(1)程序完成求一组有符号字节数的绝对值之和。 (2)程序中NEG BL指令的作用是求负数的绝对值。 (3)程序执行结束后RESULT字单元的内容是0120H。 (4)能。
(5)汇编结束后符号COUNT的值是06H。
6.阅读以下程序,回答问题 DSEG SEGMENT
ARRAY DB 34H,56H,23H,70H,96H COUNT EQU $-ARRAY
DSEG ENDS
SSEG SEGMENT PARA STACK ‘STACK’
DB 256 DUP(0)
SSEG ENDS CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:MOV AX,DSEG
MOV DS,AX
MOV SI,OFFSET ARRAY MOV CX,COUNT CLD
NEXT: LODSB
MOV BL,AL AND AL,0F0H PUSH CX MOV CL,4 SHR AL,CL
OR AL,30H CALL DISP MOV AL,BL AND AL,0FH OR AL,30H CALL DISP DEC CX JCXZ DONE
MOV AL,2CH ;逗号的ASCII码为2CH
CALL DISP JMP NEXT
DONE:MOV AH,4CH ;终止当前进程,返回调用进程
INT 21H
DISP PROC NEAR
MOV AH,14 ;写字符到当前光标位置,光标前进一格 INT 10H RET
DISP ENDP
CSEG ENDS END START
(1)程序执行结束后,屏幕上显示的内容是什么?
(2)程序中带下划线的指令可以用什么指令替代(仅一条)?
(3)程序中空格处应填入什么指令,才能保证程序按要求正常执行? 解:(1)程序执行结束后,屏幕上显示的内容是34,56,23,70,96。 (2)程序中带下划线的指令可以用LEA SI,ARRAY指令替代。
(3)程序中空格处应填入POP CX指令,才能保证程序按要求正常执行。
7.AX寄存器中存有4位压缩BCD码,试编写程序将这4位数字分开,并分别存入BH、BL、CH和CL寄存器中。
解: 参考程序段如下:
??
MOV DX,AX MOV CL,04H ROL AX,CL AND DX,0F0FH MOV BL,DH MOV CL,DL AND AX,0F0FH MOV BH,AL MOV CH,AH
??
?X/8,(0?X?20)8.已知X、Y是字节型的无符号整数,编写程序计算Y??。
X?15,(20?X?30)?解:参考程序如下:
DATA SEGMENT
X DB ? ;运行程序时取X分别位于两个分支 Y DB ? DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX MOV AL,X
CMP AL,20 JNC NEXT
MOV CL,03H SHR AL,CL JMP NEXT1
NEXT:SUB AL,15 NEXT1:MOV Y,AL
MOV AH,4CH
INT 21H
CODE ENDS END START
9.编写程序,统计寄存器BX中二进制位“1”的个数,结果存在AL中。 解:参考程序如下: CODE SEGMENT
ASSUME CS:CODE
START: MOV AL,00H MOV DX,BX MOV CX,16 AA: CMP DX,0 JZ NEXT SHL DX,1
JNC NEXT1 INC AL NEXT1: LOOP AA
NEXT: MOV AH,4CH
INT 21H CODE ENDS END START
10.编写程序段将计算机日期设置为2009年10月1日。 解:参考程序段如下:
MOV CX,2009H ;设置年 MOV DH,10H ;设置月 MOV DL,01H ;设置日 MOV AH,2BH INT 21H HLT
11.编写程序实现接收一个字符的输入,并在屏幕上用二进制形式(0/1)显示出它的ASCII码值。
解:参考程序如下: CODE SEGMENT
ASSUME CS:CODE,DS:DATA START: MOV AH,01H ;键盘输入
INT 21H MOV BL,AL