L EQU EBUFF - BUFF 问L的值是多少? 答:L=6。
4.10假设程序中的数据定义如下:
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 PTR CODE_LIST
(3) CODE_LENGTH EQU $ - CODE_LIST ;此语句必须放在CODE_LIST语
句之后 4.11 写出一个完整的数据段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、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
4.19 试说明下述指令中哪些需要加上PTR伪操作符:
BVAL DB 10H,20H WVAL DW 1000H
(1) MOV AL,BVAL ;不需要 (2) MOV DL,[BX] ;不需要 (3) SUB [BX],2 ;需要,如SUB BYTE PTR [BX],2 (4) MOV CL,WVAL ;需要,如MOV CL,BYTE PTR
WVAL
(5) ADD AL,BVAL+1 ;不需要 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字符。 答:程序段如下:
BEGIN: MOV AH, 1 ;从键盘输入一个字符的DOS调用
INT 21H CMP AL, ‘a’ ;输入字符<‘a’吗? JB STOP CMP AL, ‘z’ ;输入字符>‘z’吗? JA STOP DEC AL ;得到前导字符 MOV DL, AL ;准备显示三个字符 MOV CX, 3
DISPLAY: MOV AH, 2 ;显示一个字符的DOS调用
INT 21H INC DL
LOOP DISPLAY
STOP: RET 5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示‘MATCH’, 若不相同则显示‘NO MATCH’。 答:程序如下:
DSEG SEGMENT
STRING1 DB ‘I am a student.’ STRING2 DB ‘I am a student!’ YES DB ‘MATCH’, 0DH, 0AH, ‘$’ NO DB ‘NO MATCH’, 0DH, 0AH, ‘$’ DSEG ENDS
;-------------------------------------------------------------------------- CSEG SEGMENT MAIN PROC FAR
ASSUME CS: CSEG, DS: DSEG, ES: DSEG
START: PUSH DS ;设置返回DOS
SUB PUSH MOV MOV MOV
;
BEGIN:
AX, AX AX
AX, DSEG DS, AX ES, AX
;给DS赋值
;给ES赋值
LEA SI, STRING1 ;设置串比较指令的初值 LEA DI, STRING2 CLD
MOV CX, STRING2 - STRING1 REPE CMPSB ;串比较 JNE DISPNO LEA DX, YES ;显示MATCH JMP DISPLAY
DISPNO: LEA DX, NO ;显示NO MATCH DISPLAY: MOV AH, 9 ;显示一个字符串的DOS调用
INT 21H RET
MAIN ENDP CSEG ENDS ;以上定义代码段 ;--------------------------------------------------------------------------
END START
5.7 试编写一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它
存放在AX中。 答:程序段如下:
BEGIN: MOV BX, 0
MOV CX, 100
COMPARE: MOV AX, DATA[BX] ;取数组的第一个偶数
ADD BX, 2 TEST AX, 01H ;是偶数吗? LOOPNZ COMPARE ;不是,比较下一个数 JNZ STOP ;没有偶数,退出 JCXZ STOP ;最后一个数是偶数,即为最小偶数,退出
COMPARE1: MOV DX, DATA[BX] ;取数组的下一个偶数
ADD BX, 2 TEST DX, 01H ;是偶数吗? JNZ NEXT ;不是,比较下一个数 CMP AX, DX ;(AX)<(DX)吗? JLE NEXT MOV AX, DX ;(AX)<(DX),则置换(AX)为最小偶数
NEXT: LOOP COMPARE1 STOP: RET 5.9 试编写一个汇编语言程序,要求从键盘接收一个四位的16进制数,并在终端上显示与
它等值的二进制数。 答:程序段如下:
BEGIN: MOV
MOV MOV
INPUT: SHL
MOV INT CMP JB CMP JA AND JMP
AF: AND
CMP JB CMP JA AND ADD
BINARY: OR
DEL JNZ
DISPN: MOV 码显示 DISP: MOV
ROL RCL OR MOV INT LOOP
STOP: RET
BX, 0
CH, 4 CL, 4 BX, CL AH, 1 21H
AL, 30H INPUT AL, 39H AF AL, 0FH BINARY
AL, 1101 1111B AL, 41H INPUT AL, 46H INPUT AL, 0FH AL, 9 BL, AL CH INPUT CX, 16 DL, 0 BX, 1 DL, 1 DL, 30H AH, 2 21H DISP
;用于存放四位的16进制数
;将前面输入的数左移4位 ;从键盘取数
;<0吗?
;不是‘0~F’的数重新输入 ;是‘0~9’吗?
;不是,转‘A~F’的处理 ;转换为:0000B~1001B ;转换为大写字母 ;又
;不是‘A~F’的数重新输入 ;>F吗?
;不是‘A~F’的数重新输入 ;转换为:1010B~1111B ;将键盘输入的数进行组合
;将16位二进制数一位位地转换成ASCII
;进行显示
5.11 从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计
数结果。
答:程序段如下:
DSEG SEGMENT BUFF DB 50 DUP (‘ ’) COUNT DW 0 DSEG ENDS
┇
BEGIN: LEA BX, BUFF
MOV COUNT, 0