河北工业大学汇编语言程序设计实验.docx

上传人:b****5 文档编号:4518632 上传时间:2022-12-01 格式:DOCX 页数:28 大小:62.19KB
下载 相关 举报
河北工业大学汇编语言程序设计实验.docx_第1页
第1页 / 共28页
河北工业大学汇编语言程序设计实验.docx_第2页
第2页 / 共28页
河北工业大学汇编语言程序设计实验.docx_第3页
第3页 / 共28页
河北工业大学汇编语言程序设计实验.docx_第4页
第4页 / 共28页
河北工业大学汇编语言程序设计实验.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

河北工业大学汇编语言程序设计实验.docx

《河北工业大学汇编语言程序设计实验.docx》由会员分享,可在线阅读,更多相关《河北工业大学汇编语言程序设计实验.docx(28页珍藏版)》请在冰豆网上搜索。

河北工业大学汇编语言程序设计实验.docx

河北工业大学汇编语言程序设计实验

汇编语言程序设计实验

 

实验一顺序与分支程序设计

一、实验目的

1)掌握顺序程序设计方法。

2)掌握分支程序的结构及分支程序的设计,调试方法。

3)学习数据传送及算术和逻辑运算指令的用法。

4)熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。

二、实验内容

1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。

DATA  SEGMENT;数据段

BUF1  DW 7898H

BUF2  DW 4 DUP(0),0AH,0DH,'$'

BUF3  DW 4 DUP(0),'$'

DATA  ENDS;数据段结束

CODE  SEGMENT;代码段

    ASSUME CS:

CODE,DS:

DATA;段寄存器关联说明伪指令

BEGIN:

 MOV AX,DATA

    MOV DS,AX;将数据段的基地址装入数据段寄存器DS

    MOV AX,BUF1;将字型变量BUF1的值装入AX寄存器

    ADD AX,0;AX寄存器里的数据加0,以便进行转移测试

        JS NEXT;判断(AX)的正负,若为负则转到NEXT,为正则往下顺序执行。

        MOV BUF2,AX;为正,反码与原码一样

        MOV BUF3,AX;为正,补码与原码一样

        JMP  EEE

NEXT:

AND AX,7FFFH;将符号位变为0

        NOT AX;求反码

        MOV BUF2,AX;将BUF1的反码装入BUF2

        INC  AX;求补码

        MOV BUF3,AX;将补码装入BUF3

EEE:

MOV CX,0004H;将0004H装入CX计数器寄存器中

      MOV DI,OFFSET BUF2;将DI指向变量BUF2开始的存储单元

      MOV DX, [DI];将DI所指的数据装入DX寄存器中

      ADD DI,03;将DI指针下移三个字

BBB:

MOV AX,DX;将DX中的内容装入AX寄存器中

      AND AX,000FH;即使BUF2的低四位不变,其余均变为0

      CMP AL,0AH;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值

      JB QQQ;若[AL]<0AH,则转到QQQ,否则,顺序执行

      ADD AL,07H;因为[AL]>0AH,所以[AL]+07H,使得AL能转换成相应数字的ASCII值

QQQ:

ADD AL,30H;将[AL]转换成相应数字的ASCII值

    MOV [DI],AL;将AL中的内容装入以DS中的内容为段基地址,以DI的内容为偏移地址的存储单元中

    DEC DI;DI=DI-1,即将DI指向前一个存储单元

    PUSH CX;保存CX寄存器的内容

    MOV CL,04H;给CL寄存器赋值为04H

    SHR DX,CL;将[DX]逻辑右移四位

    POP CX;恢复CX寄存器的内容

    LOOP BBB;循环判断语句,CX=CX-1,若CX不等于0,则转到BBB,将下一个低四位存入存储单元中,否则循环结束

    MOV CX,0004H;给CX寄存器赋值为0004H

    MOV SI,OFFSET BUF3;将SI指向变量BUF3开始的存储单元

    MOV DX,[SI];将SI所指的数据装入DX寄存器中

    ADD SI,03H;将DI指针下移三个字

CCC:

MOV AX,DX;将DX中的内容装入AX寄存器中

    AND AX,000FH;即使BUF3的低四位不变,其余均变为0

   CMP AL,0AH;比较[AL]与0AH的大小,以便能正确转换为0-9的ASCII值

   JB DDD;若[AL]<0AH,则转到DDD,否则,顺序执行

   ADD AL,07H;因为[AL]>0AH,所以[AL]+07H,使得AL能转换成相应数字的ASCII值

DDD:

ADD AL, 30H;将[AL]转换成相应数字的ASCII值

   MOV [SI],AL;将AL中的内容装入以DS中的内容为段基地址,以SI的内容为偏移地址的存储单元中

   DEC SI;SI=SI-1,即将SI指向前一个存储单元

   PUSH CX;保存CX寄存器的内容

   MOV CL, 04H;给CL寄存器赋值为04H

   SHR DX, CL;将[DX]逻辑右移四位

   POP CX;恢复CX寄存器的内容

   LOOP CCC;循环判断语句,CX=CX-1,若CX不等于0,则转到CCC,将下一个低四位存入存储单元中,否则循环结束

   MOV DX, OFFSET BUF2;将BUF2的偏移地址装入DX寄存器中

   MOV AH,09H

   INT 21H;在屏幕上显示BUF1的反码

   MOV DX,OFFSET BUF3

   MOV AH,09H

   INT 21H;在屏幕上显示BUF1的补码

   MOV AH,4CH

   INT 21H;带返回码终止

   CODE ENDS

    END BEGIN

运行程序:

执行jing1.exe敲回车:

2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。

相加若有进位不存入存储单元。

DATA SEGMENT;数据段

A DB 34H,18H,2 DUP(0), '$';定义字节型变量,其后的每操作数都占有一个字节

B DB 56H, 83H;定义字节型变量,其后的每操作数都占有一个字节

DATA  ENDS;数据段结束

CODE SEGMENT;代码段

ASSUME CS:

CODE, DS:

DATA

START:

MOV AX,DATA

MOV DS, AX;将数据段基地址装入数据段寄存器DS

MOV AL, A;将A所指的数装入AL寄存器中

MOV BL, B;将B所指的数装入BL寄存器中

ADD AL, BL;AL+BL->AL

MOV AH, A+1;将A所指的下一个字节的数据装入AH

MOV BH, B+1;将B所指的下一个字节的数据装入BH

ADC AH,BH;AH与BH进行带进位加法

MOV A,AL;将第一个无符号数的相加结果放在以A起始的缓冲区

MOV A+1,AH;将第二个无符号数的相加结果放在以A+1起始的缓冲区

MOV CX,0014H;以下是将数据转换为相应的ASCII值

MOV DI, OFFSETA

MOV DX, [DI]

ADD DI, 03

NEXT:

MOV AX,DX

AND AX,000FH

CMP AL,0AH

JB QQQ

ADD AL,07H

QQQ:

ADD AL,30H

MOV [DI], AL

DEC DI

PUSH CX

MOV CL, 14

SHR  DX, CL

POP  CX

LOOP  NEXT

MOV DX, OFFSET A

MOV AH,09H

INT  21H;在屏幕上显示结果

MOV AH,4CH

INT 21H;带返回码终止

CODE ENDS

END START

 

3)在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。

STACK SEGMENT STACK;堆栈段

DB 1000 DUP(0);定义其后的每个操作数都占有一个字节

STACK ENDS;堆栈段结束

DATA SEGMENT;数据段

BUF DB72H,34H,1FH;定义字节型变量,其后的每操作数都占有一个字节

MAX DB 2 DUP (?

), '$';定义字节型变量,其后的每操作数都占有一个字节

DATA  ENDS;数据段结束

CODE  SEGMENT;代码段

ASSUME CS:

CODE,DS:

DATA,SS:

STACK

BEGIN:

 MOV AX, DATA

MOV  DS, AX;将数据段基地址装入数据段寄存器DS

MOV  AL, BUF;将BUF所指向的一个字节数据装入AL

CMP  AL,  BUF+1;比较BUF与BUF+1大小

JNB   LP1;如果BUF不小于BUF+1,则转到lp1,否则顺序向下执行

MOV  AL, BUF+1;将BUF+1所指向的一个字节数据装入AL

LP1:

  CMP  AL,  BUF+2;将BUF和BUF1中较大的一个和BUF+2比较大小

JAE   LP2;如果BUF2小,则转到lp2,否则执行顺序向下执行

MOV  AL, BUF+2;此时BUF2为三个数中最大的一个,将最大数装入AL寄存器中

LP2:

  MOV  CX, 04H;以下是将输出的最大数转换为相应的ASCII值MOV  DI, OFFSET  MAX

MOV  DL, AL

INC   DI

LP3:

   AND  AL, 0FH

CMP  AL, 0AH

JB    LP4

ADD  AL, 07H

LP4:

  ADD AL, 30H

MOV [DI],AL

DEC  DI

PUSH  CX

MOV  CL, 03H

SHR  DL, CL

POP  CX

MOV  AL, DL

LOOP  LP3

MOV  DX, OFFSET MAX

MOV  AH, 09H

INT   21H

MOV  AH,         4CH

INT     21H

CODE    ENDS

END    BEGIN

4)要求同上,只是比较的数为有符号数。

STACK  SEGMENT  STACK

DB1000    DUP(0)

STACK ENDS

DATA     SEGMENT

BUFDB     98H,             75H,             32H

MAX    DB4   DUP(?

),      '$'

DATA   ENDS

CODE    SEGMENT

ASSUMECS:

CODE,DS:

DATA,SS:

STACK

BEGIN:

  MOV    AX,DATA

MOV    DS, AX

MOV    AL, BUF

CMP    AL, BUF+1

JG         LP1;JG为比较两个有带符号数的大小,比较BUF和BUF1的大小,若BUF>BUF1,则跳转到lp1继续执行,否则顺序向下执行

XCHG    AL,      BUF+1;交换AL寄存器中的内容和BUF1,使AL寄存器中存放BUF和BUF1中较大的一个

LP1:

       MOV    MAX,    AL

JGElp2;比较两个带符号数,如果BUF2小,则转到lp2,否则执行顺序向下执行

MOVAL,BUF+2

Lp2:

MOVMAX,AL;以下是将输出的最大数转换为相应的ASCII值,与1)题相同

MOV    CX,       04H

MOV    DI,        OFFSET      MAX

MOV    DL,        [DI]

INC     DI

LP3:

       MOV    AL, DL

AND    AL, 0FH

CMP    AL, 0AH

JB          LP4

ADD    AL, 07H

LP4:

       ADDAL,     30H

MOV     [DI],    AL

DEC      DI

PUSH     CX

MOV    CL, 02

SHR     DX,       CL

POP     CX

LOOP    LP3

MOV     DX,     OFFSET      MAX

MOV    AH, 09H

INT     21H

MOV    AH, 4CH

INT     21H

CODE    ENDS

END      BEGIN

5)将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。

本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果

ORG3000H;转到3000H内存单元,在DEBUG状态下输入-a3000

3000BE0010MOVSI,1000;给SI赋值1000

3003BF0910MOVDI,1009;给DI赋值1009

30068A14MOVDL,[SI];将SI中的内容赋给DL

300880C200ADDDL,00;DL值的+00,以便进行转移测试

300B7B0BJPO2018;奇偶位为0则转移到3018执行

300D8615XCHGDL,[DI];交换DL和DI中的内容

300F8814MOV[SI],DL;把DL的值给SI

30114FDECDI;DI减1

301239FECMPSI,DI;比较SI和DI的值的大小

30147407JE201D;如果等于则转移到301D执行

3016EBF0JMP2008;无条件转移到3008执行

301846INCSI;SI加1

30198A14MOVDL,[SI];把SI的值给DL

301BEBF5JMP2012;无条件转移到3012挪移

301DF4HLT

实验二循环与子程序程序设计

一、实验目的

1)加深对循环结构的理解。

2)掌握循环程序的设计方法。

3)学习子程序的定义和调用方法。

4)掌握子程序、子程序的嵌套、递归子程序的结构。

5)掌握子程序设计、编制及调试。

6)熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。

二、实验内容

1)编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。

2)将从3000H内存单元开始的100个字节存储单元全部清0。

3)编制在屏幕上显示九九乘法表的程序。

4)编制在屏幕上显示用*组成的三角形的程序。

5)设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。

6)编写一个递归子程序,计算指数函数Xn的值,其中X,n从键盘输入。

三、源程序

EXAM2-1

DATASEGMENT

BUFDB’S=1+2×3+3×4+4×5+…+N(N+1)+…=’,’$’

RESDW4DUP(0),’$’

DATAENDS

CODESEGMENT

ASSUMECS:

CODE,DS:

DATA

START:

MOVAX,DATA

MOVDS,AX

MOVDX,OFFSETBUF

MOVAH,09H

INT21H

MOVDX,1

MOVBL,2

NEXT:

MOVAL,BL

INCBL

MULBL

ADDDX,AX

CMPAX,200

JNANEXT

MOVCX,0004H

MOVDI,OFFSETRES

ADDDI,03H

NEXT1:

MOVAX,DX

ANDAX,000FH

CMPAL,0AH

JBNEXT2

ADDAL,07

NEXT2:

ADDAL,30H

MOV[DI],AL

DECDI

PUSHCX

MOVCL,04

SHRDX,CL

POPCX

LOOPNEXT1

MOVDX,OFFSETRES

MOVAH,09H

INT21H

MOVAH,4CH

INT21H

CODEENDS

ENDSTART

执行程序EXAM2-1·EXE,屏幕上显示结果:

S=1+2×3+3×4+4×5+…+N(N+1)+…=045F

EXAM2-2

ORG2000H

2000BF0030MOVDI,3000

2003B164MOVCL,64

2005C60500MOVBYTEPTR[DI],0

200847INCDI

2009FEC9DECCL

200B75F8JNZ2005

200DF4HLT

 

EXAM2-3

DATASEGMENT

      ATAD DB?

2AH,?

3DH,?

?

20H,'$'

      ATAD1DB?

2AH,?

3DH,?

?

0DH,0AH,'$'

DATAENDS

 

STACKSEGMENTSTACK

      DB20HDUP(0)

STACKENDS

 

CODESEGMENT

      ASSUMECS:

CODE,DS:

DATA

START:

      MOVAX,DATA

      MOVDS,AX

      MOVCL,09H

      MOVBL,00H

OKL:

      MOVAL,00H

      INCBL

OK1:

      INCAL

      PUSHAX

      CMPBL,AL

      JZOK

      MOVBH,AL

      MULBL

      MOVDI,OFFSETATAD

      CALLOKP

      POPAX

      JMPOK1

OK:

      MOVBH,AL

      MULBL

      MOVDI,OFFSETATAD1

      CALLOKP

      POPAX

      LOOPOKL

      MOVAH,4CH

      INT21H

OKPPROC

      PUSHAX

      PUSHBX

      PUSHCX

      ADDBX,3030H

      MOV[DI],BH

      MOV[DI+02H],BL

      MOVCX,0AH

      MOVDH,00H

OKL2:

      CMPAX,CX

      JSOK2

      ADDCX,0AH

      INCDH

      JMPOKL2

OK2:

      SUBCX,0AH

      SUBAX,CX

      MOVAH,DH

      ADDAX,3030H

      MOV[DI+04H],AH

      MOV[DI+05H],AL

      MOVDX,DI

      MOVAH,09H

      INT21H

      POPCX

      POPBX

      POPAX

      RET

OKPENDP

CODEENDS

ENDSTART

执行程序EXAM2-2·EXE,屏幕上显示结果:

1*1=01

1*2=022*2=04

1*3=032*3=063*3=09

1*4=042*4=083*4=124*4=16

1*5=052*5=103*5=154*5=205*5=25

1*6=062*6=123*6=184*6=245*6=306*6=36

1*7=072*7=143*7=214*7=285*7=356*7=427*7=49

1*8=082*8=163*8=244*8=325*8=406*8=487*8=568*8=64

1*9=092*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

EXAM2-4

CODESSEGMENT

ASSUMECS:

CODES

START:

      XORBX,BX

      MOVDL,2AH

      MOVCX,9

LOP:

      PUSHCX

      INCBL

      MOVCL,BL

      MOVDL,2AH

LOP2:

    MOVAH,02H

      INT21H

      LOOPLOP2

      POPCX

      MOVDL,0AH

      MOVAH,02H

      INT21H

      MOVDL,0DH

      MOVAH,02H

      INT21H

      CMPBL,9

      JZENDPRO

      LOOPLOP

ENDPRO:

      MOVAH,4CH

      INT21H

CODESENDS

ENDSTART

执行程序EXAM2-4·EXE,屏幕上显示结果:

*

**

***

****

*****

******

*******

********

*********

EXAM2-5

STACK  SEGMENT  STACK

         DB 1024 DUP(0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1