4.9练习题10、写一个宏定义,要求能把任意一个寄存器的最低位移至另一个存储器的最高位中。
DATA SEGMENTVAR1 DB 4,6VAR2 DD 200 DUP(?)DATA ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATA,SS:STACKS START:MOV AX,DATAMOV DS,AX XTY MACRO X,Y MOV AX,X AND AX,1 ROR AX,1 MOV Y,AX ENDMMOV DX,1 MOV AX,0 XTY DX,AX, MOV AH,4CH INT 21H CODES ENDSEND START11、利用DOS功能调用从键盘输入60个字符到缓冲区BUF中,在按下ENTER键后在屏幕上显示这些字符。
请写出程序段。
DATA SEGMENTST1 DB 'Please input 60 characters from keyboard.',0DH,0AH,'$'BUF DB 61 DUP(?)DATA ENDSCOD SEGMENTASSUME CS:COD,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DL,07HMOV AH,2INT 21HMOV DX,OFFSET ST1MOV AH,9INT 21HLEA SI, BUFMOV CX,60LP:MOV AH,7INT 21H MOV [SI],AL CMP AL,0DH JZ EXIT INC SI LOOP LP EXIT:MOV BX,60 SUB BX,CX MOV CX,BX LEA SI, BUF LP2:MOV DL,[SI] MOV AH,6 INT 21H INC SI LOOP LP2 MOV AH,4CH INT 21H COD ENDSEND START12、试写一段程序,要求先给出一声铃响提示,屏幕上显示:“Please input a alphabet:”,然后从键盘输入一个字母送BL。
DATAS SEGMENTST1 DB 'Please Input a alphabet:',0DH,0AH,'$'ST2 DB ?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV DL,7MOV AH,2 INT 21HMOV DX,OFFSET ST1 MOV AH,9INT 21HMOV AH,1INT 21HMOV BL,ALMOV AH,4CHINT 21HCODES ENDSEND START第五章汇编语言程序设计例5-1:试用8086CPU的指令实现Y = (X1 +X2)/2的程序设计。
DATAS SEGMENTX1 DB 34HX2 DB 89HY DW ?DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATAS MOV DS,AX MOV AX,0 MOV AL,X1 MOV BL,X2 ADD AL,BL ADC AH,0 SAR AX,1 MOV [Y],AX MOV AH,4CH INT 21H CODES ENDSEND START例5-1(老书):编制实现两个三十二位数相乘的程序。
DATA SEGMENTMULNUM DW 1234H DW 0B8FDHDW 0DFE6HDW 78FFH DW 4 DUP(?) DATA ENDSCOD SEGMENTASSUME CS:COD,DS:DATASTART:MOV AX,DATAMOV DS,AXXOR AX,AXLEA BX,MULNUMMUL32:MOV AX,[BX]MOV SI,[BX+4]MOV DI,[BX+6]MUL SI ;B*d MOV [BX+8],AXMOV [BX+0AH],DX MUL DI ;B*C ADD AX, [BX+0AH] ADC DX,0MOV [BX+0AH],AX MOV [BX+0CH],DX XOR AX ,AXXOR DX ,DXMOV AX,[BX+2] MUL SI ;A*D ADD AX,[BX+0AH] ADC DX,[BX+0CH] PUSHFMOV AX,[BX+0AH] MOV DX,[BX+0CH] XOR AX ,AXXOR DX ,DXMOV AX,[BX+2]MUL DI ;A*C POPFADC AX,[BX+0CH]ADC DX,0MOV [BX+0CH],AX MOV [BX+0EH],DX XOR AX,AXMOV AH,4CHINT 21HCOD ENDSEND START例5-2:将一位十六进制数转换成与它相对应的ASCII码。
DATAS SEGMENTTABDB30H,31H,32H,33H,34H,35H,36H,37H DB38H,39H,41H,42H,43H,44H,45H,46H HEX DB 8ASC DB ?DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATAS MOV DS,AXMOV BX,OFFSET TAB MOV AL,HEX XLATMOV ASC,ALMOV AX,4C00H INT 21HCODES ENDSEND START例5-3:要求对不足250个的学生成绩进行统计分析,统计出优秀、及格和不及格的人数。
DATAS SEGMENTBUF DB 15DB64,78,89,55,69,98,45,67,96,99,92,89,85,91,45 NUM DB 3 DUP(?)DATAS ENDS CODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXMOV SI,OFFSET BUF MOV CH,[SI]MOV CL,0MOV BX,0INC SILP:MOV AH,[SI]CMP AH,90JB BLOW90INC BHNEXT:INC SIDEC CHJNZ LPMOV SI,OFFSET NUM MOV [SI],BH MOV [SI+1],BL MOV [SI+2],CL MOV AH,4CH INT 21H BLOW90:CMP AH,60 JB BLOW60 JMP ABOV60 ABOV60:INC BLJMP NEXT BLOW60:INC CLJMP NEXT CODES ENDSEND START例5-5利用表内地址跳转法来实现使键盘上A、B、C、D4个字母键成为4条输入命令,使之分别对应4个具有不同算法的控制子程序。
DATAS SEGMENTBASE DB 'pa','pb','pc','pd'KEY DB ?DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS START:MOV AX,DATASMOV DS,AXLOP:XOR AX,AX MOV AH,1INT 21HCMP AL,41HJB LOPCMP AL,44HJA LOPSUB AL,41HMOV BX,OFFSET KEY MOV AH,0ADD BX,AXJMP WORD PTR[BX] MOV AH,4CHINT 21HCODES ENDSEND START例5-6:试编写一程序,统计出某一字数据中“1”的个数。
DAT SEGMENTXDA DW 3AD8H CONT DB ?DAT ENDSCOD SEGMENT ASSUME CS:COD,DS:DAT START:MOV AX,DATMOV DS,AXMOV CL,0MOV AX,XDALOP:CMP AX,0 JZ EXIT SHL AX,1 JNC NEXT INC CL NEXT: JMP LOP EXIT:MOV CONT,CL INT 20H COD ENDSEND START例5-7:编写程序将两个n字节的无符号数相加,结果存入SUM开始的n+1字节存储区中。
DAT SEGMENTDAT1 DB12H,34H,56H,71H,23H,45H,67H DAT2 DB76H,54H,32H,17H,65H,43H,21H SUM DB 8 DUP(?) DAT ENDSCOD SEGMENTASSUME CS:COD,DS:DAT START:MOV AX,DATMOV DS,AXXOR AX,AXMOV BX,OFFSET DAT1 MOV SI,OFFSET DAT2 LEA DI,SUMMOV CX,7CLCLP:MOV AL,[SI]ADC AL,[BX]MOV [DI],ALINC BXINC SIINC DILOOP LPADC BYTE PTR [DI],0 MOV AH,4CHINT 21HCOD ENDSEND START例5-8:编制程序用单字符输出的DOS功能调用向屏幕输出以“%”结束的字符串。
DAT SEGMENTST1 DB 'How are you?%' DAT ENDSCOD SEGMENTASSUME CS:COD,DS:DAT START:MOV AX,DATMOV DS,AXLEA SI,ST1AGAIN:MOV DL,[SI] CMP DL,'%' JZ ENDOUT MOV AH,2 INT 21H INC SIJMP AGAIN ENDOUT:MOV AH,4CH INT 21H COD ENDSEND START例5-9:设有16个内存单元需要修改,修改规律是第1、3、6、9、12号单元均加5,其余单元均加10,试用循环结构变成实现。
DATAS SEGMENTXDA DB 16 DUP(?) LRULER DW 0A490H DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS START:MOV AX,DATASMOV DS,AXMOV SI,0MOV CX,16MOV BX,OFFSET XDA MOV DX,LRULER AGAIN: MOV AX,BX[SI] SHL DX,1JC ADD5ADD AX,10JMP SHORT RESULT ADD5:ADD AX,5 RESULT:MOV BX[SI],AX INC SILOOP AGAINMOV AH,4CHINT 21HCODES ENDSEND START例5-10:设某一数组的长度为N,各元素均为字数据,试编制一个程序使该数组中的数据按照从小到大的次序排列。