[程序1] 设X和Y均为16位无符号数,写一个求表达式X+Y值的程序。
程序清单如下:
DSEG SEGMENT ;数据段
X DW 1234H
Y DW 5678H
Z DW ?
DSEG ENDS
CSEG SEGMENT ;代码段
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG ;段寄存器初值
MOV DS,AX
MOV AX,X
ADD AX,Y ;求x+y和
MOV Z,AX ;保存
MOV AH,4CH
INT 21H ;程序结束退出
CSEG ENDS
END START
[程序2]编制程序,将字节变量BV AR中的压缩BCD数转换成二进制数,并存入原变量中。
在编写程序前,首先要确定转换算法。第一步,取压缩BCD数的十位;第二步,计算十位数乘以10;第三步,取个位数相加。
程序清单如下所示。
DSEG SEGMENT
BV AR DB 99H
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
START: MOV AX,DSEG
MOV DS,AX
MOV AL,BV AR
MOV CL,4
SHR AL,CL ;取高4位
MOV AH,10
MUL AH ;乘10
AND BV AR,0FH ;取低4位
ADD BV AR,AL ;相加
MOV AH,4CH
INT 21H
CSEG ENDS
END START
[程序3]设有3个单字节无符号数存放在BUF开始的缓冲区中,编写一个能将它们从大到小重新排序的程序。
由于BUF缓冲区中只有3个数据,有多种方法可实现3个数据的排序。在
此采用交换法,先找到3个数中的最大数,然后再找到剩下两个数的大数,最后将3个数据按大小依次存放。为了方便,先把要排序的3个数取到3个寄存器中,然后再对3个数进行比较排序。编写的源程序如下所示:
DATA SEGMENT
BUF DB 87,234,123
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET BUF
MOV AL,[SI] ;把3个数取到寄存器中
MOV BL,[SI+1]
MOV CL,[SI+2]
CMP AL,BL ;排序,将最大数送AL寄存器
JAE NEXT1
XCHG AL,BL
NEXT1: C MP AL,CL
JAE NEXT2
XCHG AL,CL
NEXT2: C MP BL,CL ;将最小数送CL寄存器
JAE NEXT3
XCHG BL,CL
NEXT3: M OV [SI],AL ;从大到小依次存回缓冲区
MOV [SI+1],BL
MOV [SI+2],CL
MOV AH,4CH
INT 21H
CODE ENDS
END START
[程序4]设STR字符串是以0结尾。试编写一个把字符串中的所有大写字母改为小写字母的程序,并将转换后的字符串显示输出。
编写的程序清单如下:
DATA SEGMENT
STR DB ‘HOW arE YoU!’,0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET STR ;取字符串开始地址
AGAIN:MOV DL,[SI] ;取一字符
OR DL,DL ;是否到字符串尾?
JZ OK ;到字符串尾,转OK
CMP DL,’A’;否则,判断是否为大写字母
JB NEXT ;否,转NEXT
CMP DL,’Z’
JA NEXT ;否,转NEXT
ADD DL,20H ;是大写字母,改为小写字母
MOV [SI],DL ;送回到字符串中
NEXT: MOV AH,2
INT 21H
INC SI ;调整指针
JMP AGAIN ;继续循环
OK: MOV AH,4CH
INT 21H
CODE ENDS
END START
[程序5] 设平面上一点P的直角坐标为(X,Y),X、Y为字符号数,试编制若P落在地i象限内,则令k=i;若P落在坐标轴上,则令k=0的程序。
程序清单如下:
DATA SEGMENT
X DW 8300H
Y DW 8200H
K DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
AND X,0FFFFH ;判断X是否为0
JZ K0
AND Y,0FFFFH ;判断Y是否为0
JZ K0
TEST X,8000H ;测试X符号
JZ K4
TEST Y,8000H ;测试Y符号
JZ K2
MOV K,3
JMP EXIT
K2: MOV K,2
JMP EXIT
K0: MOV K,0
JMP EXIT
K4: TEST Y,8000H
JZ K1
MOV K,4
JMP EXIT
K1: MOV K,1
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
[程序6]已知以BUF为首地址的字存储区中存放着8个有符号二进制数,试编写程序将其中大于等于0的数依次送BUF1为首地址的字存储区中,小于0的数依次送以BUF2为首地址的字存储区中。同时将大于等于0的数的个数送A字变量,将小于0数的个数送B字变量。
编写的程序清单如下:
DATA SEGMENT
BUF DW 23,123,-12,-210,45,0,90,-453
BUF1 DW 8 DUP(0)
BUF2 DW 8 DUP(0)
A DW 0
B DW 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA BX,BUF
LEA SI,BUF1
LEA DI,BUF2
MOV A,0
MOV B,0
MOV CX,8 ;置循环初值
L0: MOV AX,[BX] ;判断元素是否非负,非负则转L1 CMP AX,0
JGE L1
MOV [DI],AX ;为负则将元素送BUF2,执行B+1
ADD DI,2
INC B
JMP NEXT
L1: MOV [SI],AX ;非负则将元素送BUF1,执行A+1
ADD SI,2
INC A
NEXT: ADD BX,2 ;修改BUF的地址
LOOP L0 ;修改循环次数,未完则转L0
MOV AH,4CH
INT 21H
CODE ENDS
END START