文档库 最新最全的文档下载
当前位置:文档库 › 计算机汇编程序

计算机汇编程序

计算机汇编程序
计算机汇编程序

[程序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

相关文档