mov al,20 mul md add dx,ax mov SUM,dx code ends end start
3.21 试编写一段程序把LIST 到LIST+100 中的内容传到BLK 到BLK+100 中去。 答案: 程序段为:
MOV AX,SEG LIST
MOV DS,AX ;源串段地址送DS MOV AX,SEG BLK
MOV ES,AX ;目标串段地址送ES LEA SI, LIST ;源串偏移地址送SI LEA DI, BLK ;目标串偏移地址送DI MOV CX, 101 ;重复次数送CX CLD ;地址增 REP MOVSB
3.23 设CS:0100H 单元有一条两字节的JMP SHORT LAB 指令,若其中的位移量为: ⑴56H ⑵80H ⑶78H (4)0E0H
试写出转向目标的物理地址是多少?
答:因为CS:0100H 处存放两字节指令JMP SHORT LAB,所以当执行该指令时 (IP)=0102H
(1) 转向目标的物理地址是:(CS)*10H+(IP)+0056H=CS:0058H
(2) 转向目标的物理地址是:(CS)*10H+(IP)+0FF80H=CS:0082H;80H 对应的负数为-80H (向上转移,负位移量)
(3) 转向目标的物理地址是:(CS)*10H+(IP)+0078H=CS:0180H
(4) 转向目标的物理地址是:(CS)*10H+(IP)+0FFE0H=CS:00E2H;E2H 对应的负数为 -1EH(向上转移,负位移量)
3.24 不使用除法指令,将堆栈段中10H、11H 单元中的双字节带符号数除以8,结果存 入12H、13H 单元(注:多字节数存放格式均为低位在前,高位在后)。 POP AX POP BX
TEST AX,8000H ;测试被除数符号位 MOV CL,3
JZ ZS ;若为正数,跳转到ZS SAR AX,CL JMP OVER
ZS: SHR AX,CL OVER:PUSH AX
3.26 数据段中3030H 起有两个16 位的带符号数,试求它们的积,存入3034H-3036H 单 元中。 答案:
MOV AX,[3030H]
33
MOV BX,[3032H] IMUL BX
MOV [3034H],AX MOV [3036H]
第四章 汇编语言程序设计 习题答案(部分) 4.1 什么是标号?它有哪些属性?
答:标号是一种特殊的标识符,它代表代码段中的某个具体位置,它主要用于表明 转移的目标位置。源程序中的标号都有三种属性:段、偏移及类型。 4.2 什么是变量?它有哪些属性?
答:变量名代表存储器中的一个数据区的名字。源程序中的变量有五种属性:段、偏 移、类型、长度、规模。
4.3 什么是伪指令?什么是宏指令?伪指令在什么时候被执行?宏指令在程序中如何 被调用?
答:伪指令语句是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应 如何汇编。伪指令语句是在汇编程序对源程序汇编期间由汇编程序处理的操作。
宏是若干语句组成的程序段,宏指令语句用来定义宏。一旦把某程序段定义成宏,则可 以用宏名代替那段程序。在汇编时,要对宏进行宏展开,展开的过程是将宏名用程序段代替。 4.4 汇编语言表达式中有哪些运算符?它们所完成的运算是在什么时候进行的? 答:汇编语言表达式中的运算符有: 算术运算符 +、-、*、/、MOD
逻辑运算符 AND、OR、NOT、XOR
关系运算符 EQ、NE、LT、GT、LT、LE、GE
分析运算符 SEG、OFFSET、TYPE、LENGTH、SIZE 属性运算符 PTR、THIS、SHORT 其 它 LOW、HIGH
这些运算符都是在在汇编时由汇编程序对其运算的。 4.5 画出下列语句中的数据在存储器中的存储情况。 ORG 100H
VARB DB 34,34H,?GOOD?,2 DUP(1,2 DUP(0)) VARW DW 5678H,?CD?,$+2,2 DUP(100) VARC EQU 12
VARB DS:0100H 22H DS:010BH 00H DS:0101H 34H VARW DS:010CH 78H DS:0102H 47H DS:010DH 56H DS:0103H 4FH DS:010EH 44H DS:0104H 4FH DS:010FH 43H DS:0105H 44H DS:0110H 12H DS:0106H 01H DS:0111H 01H DS:0107H 00H DS:0112H 64H DS:0108H 00H DS:0113H 00H DS:0109H 01H DS:0114H 64H DS:010AH 00H DS:0115H 00H
4.6 按下列要求,写出各数据定义语句。
DB1 为10H 个重复的字节数据序列:1,2,5 个3,4。
33
DB2 为字符串?STUDENTS?
DB3 为十六进制数序列:12H,ABCDH
用等值语句给符号COUNT 赋以DB1 数据区所占字节数,该语句写在最后。 解答:
DB1 DB 16 DUP(1,2,5 DUP(3),4) DB2 DB ?STUDENTS? DB3 DW 12H,0ABCDH COUNT EQU DB2-DB1
4.7 指令OR AX,1234H OR 0FFH 中两个OR 有什么差别?这两个操作数分别在什么时 候执行?
解答:(1)指令OR AX,1234H OR 0FFH 中的第一个OR 是指令系统中的“或”指令,而 第二个OR 是表达式中表示逻辑“或”关系的。(2)指令OR AX,1234H OR 0FFH 中的第一个
OR 是在CPU 执行指令操作时才会执行。而第二个OR 是在汇编时就会将1234H 和0FFH 作
逻辑“或”运算,得到结果12FFH。然后执行第一个OR 指令,完成AX 的内容与12FFH 的 逻辑“或”运算。
4.8 对于下面的数据定义,各条MOV 指令单独执行后,有关寄存器的内容是什么? PREP DB ?
TABA DW 5 DUP(?) TABB DB ?NEXT? TABC DD 12345678H
(1)MOV AX,TYPE PREP ;AX=1 (2)MOV AX,TYPE TABA ;AX=2 (3)MOV AX,LENGTH TABA ;AX=5 (4)MOV AX,SIZE TABA ;AX=10 (5)MOV AX,LENGTH TABB ;AX=1 (6)MOV DX,SIZE TABC ;AX=4
4.9 设数据段DSEG 中符号及数据定义如下,试写出数据在内存中的存储示意图。 (数据段DSEG 定义略) 解答:
DAB DS:0100H 2FH DS:0113H DS:0101H 47H DS:0114H DS:0102H 4FH DS:0115H DS:0103H 54H DS:0116H DS:0104H 4FH DS:0117H DS:0105H 2FH DS:0118H DS:0106H 0DH DS:0119H DS:0107H 0AH DS:011AH
DBB DS:0108H 05H DS:011BH
DS:0109H 13H DDW DS:011CH 32H DS:010AH 61H DS:011DH 31H CCB DS:010BH DS:011EH 64H DS:010CH DS:011FH 00H
33
DS:010DH DS:0120H 33H DS:010EH DS:0121H 03H DS:010FH DS:0122H 78H DS:0110H DS:0123H 00H DS:0111H DS:0124H 64H DS:0112H DS:0125H 00H
4.10 若自STRING 单元开始存放有一个字符串(以字符?$?结束),试完成: (1)编程统计该字符串长度(不包含 $ 字符,并假设长度为两字节)。 (2)把字符串长度放在STRING 单元,把整个字符串往下移两个单元。 程序段为: (1)
MOV SI, OFFSET STRING XOR BX, BX
CONT:MOV AL, [SI] CMP AL, ?$? JZ NEXT INC BX INC SI JMP CONT
NEXT:MOV AH, 4CH INT 21H
(2)STRING DB ? $? COUNT EQU $-STRING MOV SI, OFFSET STRING MOV CX, COUNT ADD SI, CX CONT: DEC SI MOV AL, [SI] MOV [SI+2], AL LOOP CONT
MOV CX, COUNT MOV STRING, CX MOV AH, 4CH INT 21H
4.11 将字符串STRING 中的?&?字符用空格代替,字符串STRING“It is FEB&03”。 解答程序为: DATA SEGMENT
STRING DB ?It is FEB&03? COUNT EQU $-STRING DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
33