答: X-SEG SEGMENT X DW ? X-SEG ENDS Z-SEG SEGMENT Z DW ? Z-SEG EMDS
Y-SEG SEGMENT Y DW ? Y-SEG ENDS CODE SEGMENT MAIN PROC FAR
ASSUME ES:Y-SEG,CS:CODE,DS:X-SEG,SS:Z-SEG START PUSH DS SUB AX AX PUSH AX
MOV AX ,Y_SEG MOV ES ,AX MOV AX,Z_SEG MOV SS,AX
MOV AX,X_SEG MOV DS,AX MOV AX,DS:X MOV BX,ES:Y ADD AX BX JO OVERFLOW MOV BX ,SS:Z ADD AX,BX JO OVERFLOW MOV DS:X,AX OVERFLOW :RET MAIN ENDP CODE ENDS END START
18.写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加段E_SEG中的ADDEND相加,并把结果存放在D_SEG段中的SUM中。其中AUGEND、ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为-15962。 解答:TITLE SUM D_SEG SEGMENT AUGW LABEL WORD AUGEND DD 99251 SUM DW 2 DUPL (?) D_SEG ENDS E_SEG SEGMENT ADDW LABEL WORD ADDEND DD -15962 E_SEG ENDS
C_SEG SEGMENT
ASSUME DS :D_SEG ,ES:E_SEG ,CS:C-SEG MAIN PROC FAR START :PUSH DS MOVE AX,0
PUSH AX
MOV AX,D_SEG MOV DS ,AX MOV AX,E_SEG MOV ES,AX ADDT :MOV AX,AUGW MOV BX,AUGW+2
ADD AX, ES : ADDW ADC BX, ES: ADDW+2 MOV SUM ,AX MOV SUM+2,BX RET MAIN ENDP C_SEG ENDS
END START
19.读下面程序段,请问:在什么情况下,本段程序的执行结果是AH=0? BEGIN: IN AL,5FH TEST AL,80H JZ BRCHl MOV AH,0 JMP STOP BRCHl: MOV AH,0FFH STOP: HLT
解答:AL中的最高位为1时。 20.读程序:
START: IN AL,20H MOV BL,AL IN AL,30H MOV CL,AL MOV AX,0 ADLOP: ADD AL,BL ADC AH,0 DEC CL JNZ ADLOP HLT 请问: (1)本程序实现什么功能? (2)结果在哪里?
解答:完成20H*30H,结果在AX中。
21.请编一程序段完成AX*l0的任务(要求不准用乘法指令做)。 解答: MOV BX,AX MOV CL 2 SHL AX, CL ADD AX,BX SHL AX ,1 22.编程序使:
(1)AX寄存器低4位清零。 (2)BX寄存器低4位置“1”。 (3)CX寄存器低4位变反。
(4)用TEST指令测试DL寄存器位3、位6是否同时为0,若是,将0送DL;否则l送DH。 解答 :1,AND AX ,0FFF0H 2,OR BX ,000FH
3,XOR CX ,000FH 4,TEST DL ,48H JZ LOOP MOV DH,1 HLT
LOOP :MOV DL ,0 HLT
23.编一程序段,完成符号函数(-128≤x≤127):
1 (x.>0)
y= 0 (x=0) -1 (x<0)
假设x的值存放在DATAl中,y的值存放在DATA2中。 解答: START :MOV AL ,DATA1 AND AL,AL JGE BIGR MOV AL,0FFH MOV DATA2.AL HLT
BIGR:JE EQUL MOV AL,1 MOV DATA2,AL HLT
EQUL:MOV DATA2,AL HLT
24.设AX寄存器中有一个16位二进制数,编一程序,统计AX中“l”的个数,统计结果送CX中。
解答: START :MOV CX ,0 LOOP: SUB AX,0 JZ STP SAL AX,1 JNC NOD INC CX
NOD:JMP LOOP STP:HLT
25.编一子程序利用XLAT指令把十六进制数转换成ASCII码。假设ASCII码
存放在以 DAT1为首地址的数据区中,对应的16进制数放在以DAT2为首地址的数据区中,转换结果送以DAT3为首地址的数据区中。 解答:MAIN :PUSH BX PUSH SI PUSH DI PUSH CX PUSH AL PUSH DS
START:MOV BX,DATA1 MOV SI ,DATA2 MOV DI DATA3 MOV CX ,16 NEST:LODSB XLAT DATA1 STOSB
LOOP NEST
POP DS POP AL POP CX POP DI POP SI POP BX
RET 26.(略) 27.试分三种情况说明:当NUM字节单元中数据是什么情况时,TEMP字节单元分别是多少? NUM DB XX TEMP DB ? ┆ ┆
MOV AL,NUM TEST AL,99H JNE RES AND AL,99H JMP END0 RES: JS NE INC AL JMP END0 NE: DEC AL
END0: MOV TEMP,AL ┆
答:NUM字节单元中的数据是一个八位2进制数。当其第1、4、5、8位均为0时,将此数装入temp单元,若不满足此条件,则又分为两种情况,其最高位为1时(负数),将此数减1装入temp单元;其最高位为0时(正数),将此数加1装入temp单元。
28.试编制一程序,把CHAR1中各小写字母分别转换为对应的大写字母,并存放在 CHAR2各字节单元中:
CHAR1 DB ‘capitalize’ CHAR2 DB $-CHAR1 DUP(?) 解答:MOV CX ,0AH MOV SI ,0 MOV AX , 1AH
LOOP1: ADD AX ,CHAR1[SI] MOV CHAR2[SI], AX INC SI LOOP LOOP1
29.试编制一程序,把DA_BYl字节单元中数据分解成三个八进制数,其高位八进制数存放在DA-BY2字节单元中,最低位存放在DA_ BY2+2字节单元中。 DA_BY1 DB 6BH
DA_BY2 DB 3 DUP(0) 解答 : MOV AL ,DA-BY1+1 SHR AL ,2
MOV DA-BY2 ,AL MOV AL ,DA-BY1
AND AL ,07H ; (0,111) MOV DA-BY2+2,AL
30.试编制一程序,找出DA数据区中带符号的最大数和最小数。 解答: MOV CX , LENGTH MOV BX ,0000H
MOV DX ,0000H MOV SI ,0000H
LOOP1: MOV AX , ADDRESS[SI] CMP AX ,80H JGE W1
CMP AX ,BX JG W2 INC SI
LOOP LOOP1 HLT
W1: CMP AX ,DX JGE W3 JMP LOOP1 W3: MOV DX ,AX JMP LOOP1 W2: MOV BX ,AX JMP LOOP1
31.试编制一程序,统计出某数组中相邻两数间符号变化的次数。 解答:MOV CX ,LENGTH MOV SI ,0
MOV AX ,ADDRESS[SI] AND AX ,80H INC SI
MOV BX ,ADDRESS[SI] AND BX ,80H SUB BX ,AX
NEG BX
CMP BX ,80H JG W1
LOOP LOOP1 HLT
W1 INC DX JMP LOOP1 HLT
32.设某数据段已有N个学生的某科成绩(百分制),并按学号的次序存放在以STUD为首址各字单元的低字节中。现在要求按成绩的高低记入名次,并把名次填入成绩所在字单元的高字节中,各字单元的信息格式为:
15 8 7 0 名 次 成 绩 成绩相同者,名次相同。试编制一程序实现上述要求(不要排序)。 ’ 解答:START: MOV BX , OFFSET STUD
MOV DX ,OFFSET STUD ; BX ,DX中放置成绩表的偏移地址 MOV CX , N—1 ;CX中放置的是要比较的次数 MOV SI , 0 ;名次放在SI中 LOOP1: MOV AL,[DX]
LOOP2: MOV BX , [BX+2] ;取下一个同学的成绩 CMP AL , [BX]
JA NEXT ;如果比下一个同学成绩高则到NEXT即使名次加一