ADDAX,Y MOVBX,0AH MULBX ADDAX,Z ADCDX,0H MOVBX,X DIVBX
MOVRESULT,AX MOVRESULT+2,DX HLT
3.28用简单指令编程求-3/2=?,将商存DL,余数存DH单元。用TD调试后,写出DL,DH的内容。 【答】参考程序:
MOVAL,-3
CBW MOVBL,2 IDIVBL MOVDL,AL MOVDH,AH HLT
(以上参考答案由黄玉清整理)
习题四汇编语言程序设计
主要内容:汇编语言程序设计。主要介绍汇编语言程序的设计方法与编程原理,重点掌握算术运算 程序、字符串处理程序、码制转换程序、子程序设计程序、常用DOS和BIOS功能调用程序、汇编语言 常用伪指令。
4.1分析执行下列指令序列后的结果: 1)MOVAX,1234H
MOVBX,00FFH ANDAX,BX
【答】(AX)=0034H
2)MOVAL,01010101B
ANDAL,00011111B;(AL)=00010101B ORAL,11000000B;(AL)=11010101B XORAL,00001111B;(AL)=11011010B NOTAL
【答】(AL)=00100101B 3)MOVDL,05H
MOVAX,0A00H MOVDS,AX MOVSI,0H MOVCX,0FH
AGAIN:INCSI
CMP[SI],DL
LOOPNEAGAIN HLT
本程序实现了什么功能?
【答】在以0A001H开始的15个单元中查找05H。 4)MOVAX,DSEGADDR
MOVDS,AX MOVES,AX
MOVSI,OFFSETB1ADDR MOVDI,OFFSETB2ADDR MOVCX,N CLD
REPMOVSB HLT
本程序实现了什么功能?
【答】将B1ADDR中N个字节数据传送到B2ADDR开始的15个存储单元。 5)MOVAX,0H
MOVDS,AX MOVES,AX MOVAL,05H MOVDI,0A000H MOVCX,0FH CLD
AGAIN:SCASB
LOOPNEAGAIN HLT
本程序实现了什么功能?
【答】从地址0A000H开始的15个单元中查找字节型数据05H,用条件循环LOOPNZ,控制数据05H 的查找。 4.2阅读程序: 1).CLD
LEADI,[0100H] MOVCX,0080H XORAX,AX REPSTOSW
本程序实现了什么功能?
【答】将DS中起始地址为0100H的128个字节单元清零。 2).MOVAL,08H
SALAL,01H;(AL)=00010000H MOVBL,AL MOVCL,02H
SALAL,CL;(AL)=01000000H ADDAL,BL;(AL)=01010000H 本程序实现了什么功能?
【答】将AL中的内容乘以10。
4.3试分析下列程序完成什么功能?
MOVDX,3F08H MOVAH,0A2H MOVCL,4
SHLDX,CL;(DX)=F080H MOVBL,AH
SHLBL,CL;(BL)=20H SHRBL,CL;(BL)=02H ORDL,BL;(DL)=82H
【答】将DX中的低4位数据8H分离出来,将AH中的低4位数据2H分离出来,合并为82H存放在 DL。
4.4已知程序段如下:
MOVAX,1234H MOVCL,4 ROLAX,CL DECAX MOVCX,4 MULCX
试问:(1)每条指令执行后,AX寄存器的内容是什么?(2)每条指令执行后,CF,SF及ZF的 值分别是什么?(3)程序运行结束时,AX及DX寄存器的值为多少? 【答】MOVAX,1234H;(AX)=1234H,CF=SF=ZF=0
MOVCL,4
ROLAX,CL;(AX)=2341H,CF=1,SF=ZF=0 DECAX;(AX)=2340H,CF=1,SF=ZF=0 MOVCX,4;
MULCX;(AX)=8000H,CF=ZF=0,SF=1,DX=0
4.5试分析下列程序段:
ADDAX,BX JNCL2
SUBAX,BX JNCL3
JMPSHORTL5
如果AX、BX的内容给定如下:
AXBX
(1)14C6H80DCH(程序转向L2)
(2)B568H54B7H(程序转向SHORTL5)
问该程序在上述情况下执行后,程序转向何处? 【答】(1)程序转向L2。
(2)程序转向SHORTL5。
4.6以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节?
DATASEGMENT VAR1DW9;2字节
VAR2DD10DUP(?),2;44字节
VAR3DB2DUP(?,10DUP(?));22字节 VAR4DB?HOWAREYOU';11字节 DATAENDS
【答】该数据段共占79字节。
4.7下列语句在存储器中分别为变量分配多少字节空间?并画出存储空间的分配图。
VAR1DB10,2;2字节
VAR2DW5DUP(?),0;12字节
VAR3DB?HOWAREYOU?',?$';13字节 VAR4DD-1,1,0;2字节 Var1Var2Var3Var4 10?HFFH 2?O00H
?W00H ?00H ?A01H ?R00H ?E00H ?00H ?Y00H ?O00H 0U00H 0?00H
$ 4.8编写一段程序,比较两个5字节的字符串OLDS和NEWS,若相同,在RESULT置0,否则置0FFH。 【答】参考程序:
OLDSDB1,2,3,4,5 NEWSDB1,2,3,4,5 RESULTDB?
MOVSI,OFFSETOLDS MOVDI,OFFSETNEWS MOVCX,10
CLD
REPCMPSB
JNZNOEQU;串不相等转 MOVAL,0 JMPOUTPT
NOEQU:MOVAL,0FFH OUTPT:MOVRESULT,AL STOP:JMPSTOP
4.9编程求和Y=A1+A2+….+A100。其中Ai为字节变量。 【答】参考程序: DATASEGMENT
TABLEDW12,3,45,.. YALDW? YAHDW? DATAENDS
……….
MIANPROCFAR
PUSHDS MOVAX,0 PUSHAX
MOVAX,DATA MOVDS,AX MOVDX,0
XORAX,AX;清AX
MOVBX,OFFSETTABLE MOVCX,4 CLC
LP:ADDAX,[BX];求和
JNCDON INCDX CLC
DON:INCBX
INCBX;指向下一个数 LOOPLP;未加完,继续 MOVYAL,AX;存和 MOVYAH,DX
MAINENDP CODEENDS
ENDSTART
4.10内存中以FIRST和SECOND开始的单元中分别存放着两个16位组合的十进制(BCD码)数,低位在 前。编程序求这两个数的组合的十进制和,并存到以THIRD开始的单元。 【答】参考程序:1325+9839=? DATASEGMENT
FIRSTDB05H,02H,03H,01H; SECONDDB09H,03H,08H,09H; THIRDDB20DUP(?)
DATAENDS
STACKSEGMENT
ST1DB100DUP(?SA?)
TOP1EQUST1LENGTHST1
STACKENDS CODESEGMENT
ASUMMECS:CODE,DS:DATA,SS:STACK
MAINPROCFAR
START:MOVAX,DAT;初始化数据段
MOVDS,AX
MOVAX,STACK;初始化堆栈段 MOVSS,AX
MOVAX,TOP1 MOVSP,AX
MOVCX,4;计算4次
MOVBX,OFFSETDAT1;取数据地址 MOVSI,OFFSETDAT2;取数据地址 MOVDI,OFFSETSUM;取结果地址 MOVAH,00H;将暂存标志的AH清0
DON1:MOVAL,[BX];取第一个数
SAHF;将AH中的标志送标志寄存器 ADCAL,[DI];与第二个数带进位加 AAA;十进制校正
LAHF;将标志寄存器内容送AH ORAL,30H;计算值拼成ASCII码 MOV[DI],AL;存结果的ASCII码 INCBX;指向第一个数的下一位 INCSI;指向第二个数的下一位 INCDI;指向结果单元的下一位 LOOPDON1;未计算完,继续
ANDAH,01H;将最高位的进位标志送AH ORAH,30H;最高位的进位位拼成ASCII码 MOV[DI],AH;存结果的最高位
MOVAH,02H;调用DOS的02H功能显示 MOVCX,05H;显示数据的位数
DON2:MOVDL,[DI];显示数据送DL
INT21H;显示
DECDI;显示数据所在存储单元加一 LOOPDON2;未显示完,继续 MOVAH,4CH;返回DOS INT21H RET
MAINENDP CODEENDS
ENDSTART
4.11试编程序,统计由40000H开始的16K个单元中所存放的字符“A“的个数,并将结果存放在DX 中。
【答】参考程序 DATASEGMENT
DATA1DB'DFASFAAAFDFAAFFFA' COUNTEQU$-DATA1 DATAENDS
STACKSEGMENT
STADB100DUP(?)
TOPEQULENGTHSTA STACKENDS CODESEGMENT
ASSUMECS:CODE,DS:DATA,SS:STACK BEGIN:MOVAX,DATA
MOVDS,AX
MOVAX,STACK MOVSS,AX MOVAX,TOP MOVSP,AX
MOVCX,COUNT MOVDX,0 LEASI,DATA1 MOVBL,'A'
NEXT:CMP[SI],BL
JNZOTHER