3.22试编写一程序求出双字长数的绝对值。双字长数在A和A+2单元中,结果存放在B和B+2单元中。
答:程序段如下:
MOV AX, A MOV DX, A+2 CMP DX, 0 JNS ZHENSHU ;不是负数则转走 NEG DX NEG AX SBB DX, 0
ZHENSHU: MOV B, AX
MOV B+2, DX INT 20H 3.30编写程序段,把字符串STRING中的‘&’字符用空格符代替。
STRING DB ‘The date is FEB&03’ 答:程序段如下:
MOV CX, 18 MOV AL, ‘&’ CLD
MOV DI, SEG STRING MOV ES, DI ;ES段基地址 LEA DI, STRING
REPNE SCASB ;不相等重复 JNE NEXT ;相等跳转 DEC DI
MOV ES:BYTE PTR [DI], ‘ ’ ;送空格符 NEXT: ┇
3.31假设数据段中数据定义如下: STUDENT_NAME DB 30 DUP (?) STUDENT_ADDR DB 9 DUP (?) PRINT_LINE DB 132 DUP (?) 分别编写下列程序段:
(1) 用空格符清除PRINT_LINE域。
(2) 在STUDENT_ADDR中查找第一个‘-’。 (3) 在STUDENT_ADDR中查找最后一个‘-’。
(4) 如果STUDENT_NAME域中全是空格符时,填入‘*’。
(5) 把STUDENT_NAME移到PRINT_LINE的前30个字节中,把STUDENT_ ADDR
移到PRINT_LINE的后9个字节中。 答:公共的程序段如下:
MOV DI, DS MOV ES, DI (1) MOV CX, 132
MOV AL., ‘ ’ ;空格的ASCII码送AL寄存器
4
CLD LEA DI, PRINT_LINE REP STOSB (2) MOV CX, 9
MOV AL., ‘-’ CLD LEA DI, STUDENT_ ADDR REPNE SCASB JNE NO_DASH DEC DI NO_DASH: ┇ (3) MOV CX, 9
MOV AL., ‘-’ STD LEA DI, STUDENT_ ADDR ADD DI, 9-1 REPNE SCASB JNE NO_DASH INC DI NO_DASH: ┇ (4) MOV CX, 30
MOV AL, ‘ ’ ;空格的ASCII码送AL寄存器 CLD LEA DI, STUDENT_NAME REPE SCASB JNE NEXT MOV CX, 30 MOV AL, ‘*’ ;“*”的ASCII码送AL寄存器 LEA DI, STUDENT_NAME REP STOSB NEXT: ┇ (5) MOV CX, 30
CLD LEA SI, STUDENT_NAME LEA DI, PRINT_LINE REP MOVSB MOV CX, 9 STD LEA SI, STUDENT_ADDR+9-1 LEA DI, PRINT_LINE+132-1 REP MOVSB
3.32编写一程序段:比较两个5字节的字符串OLDS和NEWS,如果OLDS字符串不同于
NEWS字符串则执行NEW_LESS;否则顺序执行程序。
答:程序段如下:
4
DI, SEG OLDS DS, DI ES, DI SI, OLDS DI, NEWS CMPSB NEW_LESS
┇
NEW_LESS: ┇ 3.47请编写一程序段,要求把考虑溢出)。
答:MOV EDI,0
ADD EDI,ECX ADD EDI,EDX ADD EDI,ESI
ECX、EDX和ESI的内容相加,其和存入EDI寄存器中(不
也可为: MOV EDI,ECX ADD EDI,EDX ADD EDI,ESI
MOV
CLD MOV MOV MOV LEA LEA REPE JNE
CX, 5
3.49试编写一程序段,要求把BL中的数除以CL中的数,并把其商乘以2,最后的结果存入DX寄存器中。 答:MOV
MOV DIV MOV SHL MOV
AL,BL
AH,0 ;假定为无符号数,否则用CBW指令即可 CL AH,0
AX,1 ;逻辑左移1位 DX,AX
3.51试编写一程序段,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字节单元UP中;找出小于42H的无符号数的个数并存入字节单元DOWN中。 答:JMP BEGIN ;无条件转移 存储器 UP DB 0 新(SP) 002EH DOWN DB 0 002FH TABLE DB 100H DUP (?) ;数组 0030H BEGIN: 0031H MOV CX,100H 0032H MOV BX,-1 ;数组下标 0033H 堆 MOV SI,0 0034H 栈 MOV DI,0 0035H 帧 L1:INC BX 0036H CMP TABLE[BX],42H 0037H JA L2 ;高于 0038H JB L3 ;低于 0039H JMP L4 ;否则跳到L4 003AH 新(BP) L2:INC SI ;UP 003BH JMP L4 003CH 原(SP)
3.52题的答案 4
L3:INC L4:LOOP
MOV MOV DI ;DOWN L1
UP,SI DOWN,DI
4.1 1试写出一个完整的数据段DATA_SEG,它把整数5赋予一个字节,并把整数-1,0,2,
5和4放在10字数组DATA_LIST的头5个单元中。然后,写出完整的代码段,其功能为:把DATA_LIST中头5个数中的最大值和最小值分别存入MAX和MIN单元中。 答:DATA_SEG SEGMENT
NUM DB 5
DATA_LIST DW -1, 0, 2, 5, 4, 5 DUP (?) MAX DW ? MIN DW ? DATA_SEG ENDS
;---------------------------------------------------------------- CODE_SEG SEGMENT MAIN PROC FAR
ASSUME CS: CODE_SEG, DS: DATA_SEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, DATA_SEG ;给DS赋值 MOV DS, AX
;
MOV CX, 4 ;程序段开始 LEA BX, DATA_LIST MOV AX, [BX] MOV MAX, AX MOV MIN, AX
ROUT1: ADD BX, 2
MOV AX, [BX] CMP AX, MAX JNGE ROUT2 MOV MAX, AX
ROUT2: CMP AX, MIN
JNLE ROUT3 MOV MIN, AX
ROUT3: LOOP ROUT1 ;程序段结束
RET
MAIN ENDP CODE_SEG ENDS
;----------------------------------------------------------------
END START 4.17写一个完整的程序放在代码段C_SEG中,要求把数据段D_SEG中的AUGEND和附加
段E_SEG中的ADDEND相加,并把结果存放在D_SEG 段中的SUM中。其中AUGEND、
4
ADDEND和SUM均为双精度数,AUGEND赋值为99251,ADDEND赋值为 -15962。
答:程序如下:
D_SEG SEGMENT AUGW LABEL WORD AUGEND DD 99251 SUM DD ? D_SEG ENDS ;以上定义数据段 ;---------------------------------------------------------------- E_SEG SEGMENT ADDW LABEL WORD ADDEND DD -15962 E_SEG ENDS ;以上定义附加段 ;---------------------------------------------------------------- C_SEG SEGMENT MAIN PROC FAR
ASSUME CS: C_SEG, DS: D_SEG, ES: E_SEG
START: PUSH DS ;设置返回DOS
SUB AX, AX PUSH AX
MOV AX, D_SEG MOV DS, AX ;给DS赋值 MOV AX, E_SEG MOV ES, AX ;给ES赋值
;
MOV AX, AUGW ;以下6条指令进行加法计算 MOV BX, AUGW+2 ADD AX, ES: ADDW ADC BX, ES: ADDW+2 ;不考虑有符号数溢出 MOV WORD PTR SUM, AX MOV WORD PTR [SUM+2], BX RET
MAIN ENDP C_SEG ENDS ;以上定义代码段 ;----------------------------------------------------------------
END START
5.1 试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。
答:程序段如下: BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用
INT 21H
CMP AL, ‘a’ ;输入字符<‘a’吗? JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗? JA STOP SUB AL, 20H ;转换为大写字母,用AND AL, 1101 1111B也可
4