北京理工大学汇编语言实验五 子程序设计实验

实验五子程序设计实验(设计性实验)

一、实验要求和目的

1.熟悉汇编语言程序设计结构;

2.熟悉汇编语言子程序设计方法;

3.熟悉利用汇编语言子程序参数传递方法;

4.熟悉汇编语言字符串处理基本指令的使用方法;

5.掌握利用汇编语言实现字符串的输入输出程序设计方法;

6.掌握数制转换程序实现方法。

二、软硬件环境

1、硬件环境:计算机系统windows;

2、软件环境:装有MASM、DEBUG、LINK、等应用程序。

三、实验涉及的主要知识

A)子程序知识要点:

1.掌握子程序的定义语句;

过程名 PROC [near/far]

过程体

RET

过程名 ENDP

2.子程序结构形式

一个完整的子程序一般应包含下列内容:

1、)子程序的说明部分

在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法. 说明时,应含如下内容:

.子程序名:命名时要名中见意.

.子程序的功能:说明子程序完成的任务;

.子程序入口参数:说明子程序运行所需参数及存放位置;

.子程序出口参数:说明子程序运行结果的参数及存放位置;

.子程序所占用的寄存器和工作单元;

.子程序调用示例;

2、)掌握子程序的调用与返回

在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。

.段内调用与返回:调用子程序指令与子程序同在一个段内。因此只修改IP;

.段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。

3.)子程序的现场保护与恢复

保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。

一般利用堆栈实现现场保护和恢复的格式:

过程名PROC [NEAR/FAR]

PUSH AX

PUSH BX.

PUSH DX

POP DX.

POP AX

RET

过程名 ENDP

3.子程序的参数传递方法

1.寄存器传递参数

这种方式是最基本的参数传递方式。

2.存储器单元传(变量)递参数

这种方法是在主程序调用子程序前,将入口参数存放到约定的存储单元中;子程序运行时到约定存储位置读取参数;子程序执行结束后将结果也放在约定存储单元中。

3.用堆栈传递参数

利用共享堆栈区,来传递参数是重要的的方法之一。

B)字符、字符串输入输出知识要点:

在实际应用中,经常需要从键盘输入数据并将结果等内容显示到屏幕上,方便程序控制及查看结果。汇编语言的数据输入和输出分成两类,一是单个字符数据的输入输出,一是字符串数据的输入输出。都可以通过DOS 功能调用来实现,下面就分别介绍下用来实现数据输入输出的功能调用的使用方法。

1、单个字符输入

单个字符输入可以利用DOS 的1 号功能调用来完成,使用方法为:

MOV AH,1

INT 21H

这两条语句执行后,光标会在屏幕上闪烁,等待输入数据,输入的数据以ASCII

码形式存储在AL 寄存器中。

2、单个字符输出

单个字符输出可利用DOS2 号功能调用来完成,使用方法为:

MOV DL,’?’

MOV AH,2

INT 21H

单个字符输出需要把要输出字符的ASCII 码放在DL 寄存器中。

3、字符串输入

从键盘输入一串字符串可以利用DOS 的10 号功能调用来完成,使用方法为:

BUF DB 50 ;预定义可以输入的最大字符个数

DB ? ;实际输入字符个数,根据输入自动统计

DB 50 DUP (?) ;存放输入字符串数据缓冲区

LEA DX,BUF

MOV AH,10

INT 21H

4、字符串输出

字符串输出可由DOS 9 号功能调用来完成,使用方法为:

STRING DB ‘HELLO$’

LEA DX,STRING

MOV AH,9

INT 21H

C)表的处理知识要点:

表的处理在实际数据处理中应用较为广泛,主要有排序、搜索、插入和删除等操作。有

一些常用的冒泡法、对分搜索法等需要掌握。

四、实验内容与步骤

1、从键盘输入一串字符串(显示提示)到内存中,在该字符串的某一个指定位置,插入某一字符或删除某一字符,并显示操作后的字符串。

2、编写程序把从键盘输入的四位十六进制数,转换为十进制形式在屏幕上打印出来。

3、从键盘输入(显示提示)十个2 位十进制数(正数)到内存中,按从小到大排序,然后把该数以十六进制形式在屏幕上打印出来。

4、英文人名排序。从终端键入20 个人名,当所有人名都键入后,按字母上升的次序将人名排序,并在屏幕上显示已经排好序的人名。

注意:以上各题要求用子程序方法实现,每个题目至少包含2 个子程序。涉及到初始数据的,同学们自行给出多组数据,反复加以验证各题程序。

五、实验要求与提示

1、实验要求

(1)画出各程序流程图;

(2)列出程序清单,加上适量注释;

(3)回答思考问题;

(4)记录实验结果;

(5) 完成实验报告(实验材料上的内容简写,自己的工作要详尽)。

六、思考与练习以及测评标准

1.字符串在内存中是如何存储的?

2.屏幕有多个字符串显示时,如何换行?

七、程序流程图

Y

八、实验结果

九、思考题

1.以8位ASCII码的形式连续存储

2.先输出换行符,然后输出回车符

十、程序代码

datas segment

buf4 db 460 dup('$')

bp4 dw 20 dup(0)

mark db '@@'

num41 dw 20

num42 dw 19

num3 db 20 dup(0)

num3t db 10 dup(0)

num31 dw 10

num32 dw 9

num2 db 0,0,0,0

num22 dw 0

tempio db 0

temp dw 0

tab db '0123456789abcdef'

tip1 db 'Please input:$'

tip2 db 'Please input 10 DEC numeral with space:$'

buf1 db 20

db ?

db 20 dup('$')

num1 db 0

num1t db 3

db ?

db 2 dup(0)

temp1 db ' '

datas ends

stacks segment

stack dw 32 dup(0) stacks ends

codes segment

assume

ds:datas,ss:stacks,cs:codes

start: mov ax,datas

mov ds,ax

mov es,ax

mov ax,stacks

mov ss,ax ;;;;;;;;;;;;;;;;;;;;1start

lea si,tip1

call puts

call newline

lea si,buf1

call gets

lea si,num1t

call gets

inc si

inc si

mov ah,ds:[si]

inc si

mov al,ds:[si]

mov bl,'0'

sub ah,bl

sub al,bl

mov bl,al

mov al,ah

mov ah,0

mov cl,10

mul cl

add al,bl

mov num1,al

call input

call newline

mov bl,tempio

mov temp1,bl

lea si,buf1

inc si

inc si

mov cx,0

mov cl,num1

dec cl

jz l11

l1: mov al,ds:[si]

mov tempio,al

call output

inc si

loop l1

l11: mov al,temp1

cmp al,0dh

jz l12

mov tempio,al

call output

dec si

l12: inc si

call puts

call newline

call newline

;;;;;;;;;;;;;;;;;;;;1end

;;;;;;;;;;;;;;;;;;;;2start

mov ax,0

lea si,num2

call input

mov al,tempio

sub al,'0'

mov ds:[si],al

inc si

call input

mov al,tempio

sub al,'0'

mov ds:[si],al

inc si

call input

mov al,tempio

sub al,'0'

mov ds:[si],al

inc si

call input

mov al,tempio

sub al,'0'

mov ds:[si],al

call newline

lea si,num2

mov cx,4

mov dx,0ah

l2: cmp ds:[si],dl

jb l21

mov al,ds:[si]

sub al,7

mov ds:[si],al l21: inc si

loop l2

lea si,num2

mov ah,ds:[si]

mov cx,4

shl ah,cl

inc si

mov bl,ds:[si]

add ah,bl

inc si

mov al,ds:[si]

mov cx,4

shl al,cl

inc si

mov bl,ds:[si]

add al,bl

mov num22,ax

;1

mov dx,0

mov cx,2710h

div cx

mov temp,dx

add ax,'0'

mov tempio,al

call output

mov ax,temp

;2

mov dx,0

mov cx,3e8h

div cx

mov temp,dx

add ax,'0'

mov tempio,al

call output

mov ax,temp

;3

mov dx,0

mov cx,64h

div cx

mov temp,dx

add ax,'0'

mov tempio,al

call output

mov ax,temp

;4

mov dx,0

mov cx,0ah

div cx

mov temp,dx

add ax,'0'

mov tempio,al

call output

mov ax,temp

;5

add ax,'0'

mov tempio,al

call output

call newline

call newline ;;;;;;;;;;;;;;;;;;;;2end ;;;;;;;;;;;;;;;;;;;;3start

lea si,tip2

call puts

call newline

lea si,num3

mov cx,20

l3: call input

mov dl,' '

cmp dl,tempio

jz l31

mov al,tempio

sub al,'0'

mov ds:[si],al

inc si

dec cx

jz l32

l31: jmp l3

l32:

lea si,num3

lea di,num3t

mov cx,10

l33: mov ax,0

mov al,ds:[si]

mov dl,10

mul dl

inc si

add al,ds:[si]

mov es:[di],al

inc si

inc di

loop l33

;sort

sort31: lea si,num3t

mov ax,9

mov num32,ax

sort32: mov al,ds:[si]

inc si

cmp al,ds:[si]

js skip31

xchg al,ds:[si]

mov ds:[si-1],al

skip31: mov cx,num32

dec num32

loop sort32

mov cx,num31

dec num31

loop sort31

call newline

mov num31,10

lea si,num3t

l34: mov al,ds:[si]

mov tempio,al

inc si

call printnumb

call space

mov cx,num31

dec num31

loop l34

call newline

call newline

;;;;;;;;;;;;;;;;;;;;3end

;;;;;;;;;;;;;;;;;;;;4start

lea si,buf4

lea di,bp4

mov cx,20

;input

l4: mov al,20

mov ds:[si],al

mov dx,si

add dx,2

mov es:[di],dx

inc di

inc di

call gets

add si,23

loop l4

;sort

l41: lea si,bp4

mov ax,19

mov num42,ax

l42: mov di,ds:[si+2]

mov temp,si

mov ax,ds:[si]

mov si,ax

mov cx,20

repe cmpsb

js skip41 ;不需修改

mov si,temp ;修改

mov ax,ds:[si]

xchg ax,ds:[si+2]

mov ds:[si],ax

skip41: mov si,temp

inc si

inc si

mov cx,num42

dec cx

mov num42,cx

inc cx

loop l42

mov cx,num41

dec cx

mov num41,cx

inc cx

loop l41

;ouput

call newline

lea di,bp4

mov cx,20 l43: mov temp,cx

mov si,es:[di]

call puts

call newline

inc di

inc di

mov cx,temp

loop l43 ;;;;;;;;;;;;;;;;;;;;4end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Q: mov ah,4ch

int 21h ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

printnumb:

mov al,tempio

mov cl,4

shr al,cl

lea bx,tab

mov ah,0

add bx,ax

mov dl,ds:[bx]

mov ah,2

int 21h

mov al,tempio

mov cl,0fh

and al,cl

lea bx,tab

mov ah,0

add bx,ax

mov dl,ds:[bx]

mov ah,2

int 21h

ret

printnum: ;output

the ASCII in temp W

;1

mov ax,temp

mov cx,4

shr ah,cl

mov al,ah

mov ah,0

lea bx,tab

add bx,ax

mov dl,ds:[bx]

mov ah,2

int 21h

;2

mov ax,temp

and ah,0fh

mov al,ah

mov ah,0

lea bx,tab

add bx,ax

mov dl,ds:[bx]

mov ah,2

int 21h

;3

mov ax,temp

mov cx,4

shr al,cl

mov ah,0

lea bx,tab

add bx,ax

mov dl,ds:[bx]

mov ah,2

int 21h

;4

mov ax,temp

and al,0fh

mov ah,0

lea bx,tab

add bx,ax

mov dl,ds:[bx]

mov ah,2

int 21h

ret

gets: m ov ah,10

mov dx,si

int 21h

call newline

ret

pgets: mov cl,ds:[si]

mov ch,0

inc si

inc si

lpgets: mov al,ds:[si]

cmp al,0dh

jz pend

mov tempio,al

call output

inc si

loop lpgets pend: ret puts: mov ah,9

mov dx,si

int 21h

ret

input: mov ah,1

int 21h

mov tempio,al

ret newline:mov ah,2

mov dl,0dh

int 21h

mov ah,2

mov dl,0ah

int 21h

ret

space: mov dl,' '

mov ah,2

int 21h

ret

output: mov ah,2

mov dl,tempio

int 21h

ret

codes ends

end start

北京理工大学汇编语言实验五 子程序设计实验

实验五子程序设计实验(设计性实验)

一、实验要求和目的 1.熟悉汇编语言程序设计结构; 2.熟悉汇编语言子程序设计方法; 3.熟悉利用汇编语言子程序参数传递方法; 4.熟悉汇编语言字符串处理基本指令的使用方法; 5.掌握利用汇编语言实现字符串的输入输出程序设计方法; 6.掌握数制转换程序实现方法。 二、软硬件环境 1、硬件环境:计算机系统windows; 2、软件环境:装有MASM、DEBUG、LINK、等应用程序。 三、实验涉及的主要知识 A)子程序知识要点: 1.掌握子程序的定义语句; 过程名 PROC [near/far] 过程体 RET 过程名 ENDP 2.子程序结构形式 一个完整的子程序一般应包含下列内容: 1、)子程序的说明部分 在设计了程序时,要建立子程序的文档说明,使用户能清楚此子程序的功能和调用方法. 说明时,应含如下内容: .子程序名:命名时要名中见意. .子程序的功能:说明子程序完成的任务; .子程序入口参数:说明子程序运行所需参数及存放位置; .子程序出口参数:说明子程序运行结果的参数及存放位置; .子程序所占用的寄存器和工作单元; .子程序调用示例; 2、)掌握子程序的调用与返回 在汇编语言中,子程序的调用用CALL,返回用RET 指令来完成。 .段内调用与返回:调用子程序指令与子程序同在一个段内。因此只修改IP; .段间调用与返回:调用子程序与子程序分别在不同的段,因此在返回时,需同时修改CS:IP。 3.)子程序的现场保护与恢复 保护现场:在子程序设计时,CPU 内部寄存器内容的保护和恢复。 一般利用堆栈实现现场保护和恢复的格式: 过程名PROC [NEAR/FAR] PUSH AX PUSH BX. PUSH DX POP DX.

第五次汇编语言实验报告-子程序设计

《 汇编语言实验报告 Assembly Language Programming Lab Reports ______________________________________________________________________________班级:姓名:学号:实验日期: 学院:专业: 实验顺序:原创:___ 实验名称:子程序设计 实验分数:_______ 考评日期:________ 指导教师: ______________________________________________________________________________一.— 二.实验目的 1、掌握过程调用伪指令: PROC,ENDP,NEAR和FAR。 2、掌握 CALL,RET,RET n。理解子程序调用时现场保护和恢复现场的意义。 3、掌握子程序传递参数的三种方式,寄存器,内存单元,堆栈。 4、培养在复杂的程序设计时,采用模块化结构划分功能,分解程序的意识。 5、对子函数的嵌套调用和递归调用有一定的理解。 ______________________________________________________________________________三.实验环境 】 操作系统:windows 8 编译程序:masm ______________________________________________________________________________四.实验原理 1.子程序递归,堆栈传参 2.寄存器、存储器传参 ______________________________________________________________________________ 四.… 五.实验步骤及结果分析 1.子程序递归调用(求阶乘) 用堆栈进行传递参数 高级语言函数调用过程 Fac(n) = fac(n-1)*n n>0 Fac(n)= 1 n=0 高级语言递归调用,形参中的内容在这层递归调用结束后才会被释放 实参 5 实参 4 实参 3 实参 2 实参 1 形参 n=5 形参 n =4 形参 n =3 形参 n =2 形参 n =1 @ 》

汇编语言程序设计实验报告

实验报告实验名称汇编语言程序设计 | | 专业班级:信息安全 学号: 姓名:

实验一汇编语言上机过程和Debug常用调试命令 一.实验目的: 学习程序设计的基本方法和技能,熟练掌握用汇编语言设计、编写、调试和运行程序的方法。 二.实验题目: 熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。在调试过程中,学习及掌握debug程序的各种操作命令。 三.问题描述: 试编写一程序:比较两个字符串string1和string2所含的字符是否相同,若相同则显示‘match’; 否则,显示‘no match’。 四.方法说明: a)使用ws、tc或EDIT编辑程序来建立源文件,然后存盘,使系统返回DOS。 b)用汇编程序masm(或asm)对源文件汇编产生目标文件obj 如:汇编指示出错则需重新调用编辑程序修改错误,直至汇编通过为止。 c)用连接程序link 产生执行文件EXE. d)执行程序,可直接从DOS执行程序。 e)使用debug程序调试程序的方法。 五.实验步骤: 1.调用字处理程序EDIT 建立以sample.asm文件 datarea segment string1 db‘move the cursor backward.’ string2 db‘move the cursor backward.’ mess1 db ‘Match..’,13,10,’$’ mess2 db ‘No match!..’,13,10,’$’ datarea ends prognam segment main proc far assume cs:prognam,ds:datarea,es:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov es,ax lea si,string1 lea di,string2 cld mov cx,25

汇编实验报告--子程序设计实验

实验五子程序设计实验 学生姓名:何茂杰学号:2010305104 专业班级:计算机本科一班 指导老师:文远熔实验日期:实验成绩: 一、实验目的 1.掌握主程序与子程序之间的调用关系及调用方法; 2.掌握子程序调用过程中近程调用与远程调用的区别; 3.掌握通过堆栈转送参数的方法。 二、实验内容 1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕 上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。 三、实验环境 PC微机 DOS操作系统或Windows 操作系统 四、实验要求 1.第一个实验程序用子程序的近程调用实现。由于在调用HEXASC子程序时,子程 序又调用了DISP子程序,这叫子程序的嵌套调用。实验过程中可以从堆栈的内容看到两个子程序的返回地址值。由于是近调用,地址值只包括返回地址的段内偏移量。在每个子程序的执行中,检查CS值是不变的。 2.预习子程序设计的基本方法,根据实验内容要求,画出子程序及主程序的流程图; 熟悉键盘键入字符串及用堆栈传送参数的程序段编制方法。 五、主要实验步骤 1.编辑、汇编两个源程序,生成相应的可执行文件(.EXE) 2.用DEBUG的R命令,T命令或G命令和D命令检查远程调用及近程调用时堆栈 的变化。特别是通过堆栈传送的参数和子程序取出的参数是返回参数的详细过程。 3.检查程序执行的结果是否正确。 六.实验结果:

七.心得体会 了解了把BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码源代码:.MODEL SMALL .336 .STACK 200H .DA TA AS CV AL DB ‘12345’ BINV AL DW ? .CODE MAIN PROC START: MOV AX,@DA TA MOV DS,AX LEA BX ASCV AL PUSH BX LEA BX,BINV AL PUSH BX

子程序设计实验报告1

子程序设计实验报告

学号:0740303104 姓名:雷凤 子程序设计实验报告 一、实验目的: 1、训练子程序;调用程序以及DOS功能调用程序的编制,进一步熟悉和灵活使用系统功能调用,培养根据具体情况合理划分程序模块的能力 2、掌握主、子程序之间的调用关系,联结方法,提高使用各种参数传递方法的正确性和灵活性。 3、掌握调试主、子程序的基本方法,通过调试进一步理解和加深堆栈在子程序设计中的重要意义的认识 4、上机前要求写好被调试程序的程序文本,并进行静态调试,然后拟定好调试计划和上机操作步骤。 二、实验要求: 1、具体了解和掌握call指令,主,子程序之间的调用和在使用时应注意的问题 2、学习子程序设计和调用的一般方法。 三、实验内容 1、实验任务 试编制一程序,分别对NUM字节单元数组中统计出有多少个20,有多少个5,有多少个2,有多少个1.统计的个数分别放在NUM20、num5、num2、num1单元中。 1. 程序要求用主程序-子程序的结构形式编制。 2. 并且传递参数的方式为堆栈方法。 2、实验的原理 在主程序部分,将统计个数的单元分别放在俩个通用寄存器——AH,AL,DH,DL中,数组首址和数组长度都压栈,设置一个循环次数,送给CX,再调用输出语句进行输出。最重要的是子程序JUSUAN,做好保护现场等准备工作后就将数组中的

每个元素分别与20,5,2,1比较,根据不同的结果转到不同的分支语句,对应的不同的计数器相应地增1,并修改地址,继续循环比较。 3、程序设计流程图 子程序流程图

四、实验步骤 1、编辑(纪事本) DATAS SEGMENT NUM DB 20,1,20,5,2,5,2,2,2,20 COUNT EQU $-NUM NUM20 DB? NUM5 DB? NUM2 DB? NUM1 DB? ;此处输入数据段代码 DATAS ENDS STACK SEGMENT PARA STACK 'STACK' STAPN DB 100 DUP(?) ;此处输入堆栈段代码 STACK ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACK MAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX,DATAS MOV DS,AX MOV AX,STACK MOV SS,AX START:

子程序设计实验报告

子程序设计实验报告 1. 实验目的 本实验旨在通过设计子程序,巩固和提升学生对于子程序设计的理解和运用能力,培养学生的逻辑思维和程序设计能力。 2. 实验内容 2.1 设计一个子程序,实现两个数相加的功能。 2.2 设计一个子程序,实现两个数相乘的功能。 2.3 设计一个子程序,实现对一个数的平方根的计算。 3. 实验步骤 3.1 子程序1:实现两个数相加 assembly add_numbers: ; 输入:寄存器R1和R2分别存放两个待相加的数 ; 输出:寄存器R0存放相加结果 ; 保存现场 PUSH R1 PUSH R2

; 执行相加操作 ADD R0, R1, R2 ; 恢复现场 POP R0 POP R2 POP R1 ; 返回 RET 3.2 子程序2:实现两个数相乘 assembly multiply_numbers: ; 输入:寄存器R1和R2分别存放两个待相乘的数 ; 输出:寄存器R0存放相乘结果 ; 保存现场 PUSH R1 PUSH R2

; 执行相乘操作 MUL R0, R1, R2 ; 恢复现场 POP R0 POP R2 POP R1 ; 返回 RET 3.3 子程序3:实现对一个数的平方根的计算assembly calculate_sqrt: ; 输入:寄存器R1存放待计算平方根的数 ; 输出:寄存器R0存放计算结果 ; 保存现场 PUSH R1 PUSH R0

; 初始化结果为0 XOR R0, R0 ; 循环计算平方根 LDR R2, 1 ; 设定计算误差精度为1 sqrt_loop: ; 比较结果的平方与待计算数的大小 MUL R3, R0, R0 CMP R3, R1 ; 结果满足精度要求,跳出循环 BHI sqrt_done ; 调整结果 ADD R0, R0, R2 ; 继续循环 B sqrt_loop sqrt_done: ; 恢复现场 POP R0

子程序设计实验报告

子程序设计实验报告 子程序设计实验报告 引言: 子程序是计算机程序中的一个重要组成部分,它能够将一个大的任务分解成若干个小的子任务,使得程序结构更加清晰,并且提高了代码的可复用性和可维护性。本次实验旨在通过设计和实现一些子程序,来加深对子程序设计的理解和应用。 一、实验目的 本次实验的主要目的是掌握子程序的基本概念和设计方法,并通过实际编程实现一些常见的子程序功能。具体目标如下: 1. 理解子程序的定义和调用过程; 2. 掌握参数传递和返回值的方法; 3. 设计和实现一些常见的子程序功能。 二、实验环境 本次实验使用的是C语言编程环境,具体使用的是GCC编译器。 三、实验内容 1. 子程序的定义和调用 子程序是一个独立的代码块,可以在程序中被多次调用。在C语言中,子程序的定义使用函数的方式进行,通过函数名来调用子程序。在定义子程序时,需要指定子程序的返回类型、参数类型和参数个数。在调用子程序时,需要提供相应的参数。 2. 参数传递和返回值

在子程序的调用过程中,参数的传递是一个重要的问题。参数可以通过值传递、引用传递或指针传递的方式进行。在值传递中,实参的值会被复制到形参中; 在引用传递中,实参的地址会被传递给形参;在指针传递中,实参的指针会被 传递给形参。返回值可以通过return语句来实现,返回值的类型需要与子程序 的返回类型相匹配。 3. 子程序的设计和实现 根据实际需求,设计和实现一些常见的子程序功能,例如求两个数的最大公约数、判断一个数是否为素数等。在设计子程序时,需要考虑输入参数的合法性 和边界条件,以及返回值的正确性。 四、实验步骤 1. 确定子程序的功能和输入输出要求; 2. 设计子程序的算法和流程; 3. 编写子程序的代码,并进行调试和测试; 4. 在主程序中调用子程序,并验证其正确性; 5. 对实验结果进行分析和总结。 五、实验结果与分析 通过实验,我们成功设计和实现了一些常见的子程序功能,例如求两个数的最 大公约数和判断一个数是否为素数。在实验过程中,我们深入理解了子程序的 概念和设计方法,并掌握了参数传递和返回值的技巧。通过对实验结果的分析,我们发现子程序能够大大提高程序的模块化程度,使得程序结构更加清晰和易 于理解。 六、实验总结

汇编子程序设计实验心得(精选5篇)

汇编子程序设计实验心得(精选5篇) 汇编子程序设计实验心得【篇1】 经过了一周左右密集的学习,仔细地回顾和评估了自己学习的过程,我切实地发现28定律在编程学习中同样发挥着作用。在很长一段时间以前的学习中,我总是试图把一本书从头读到尾,或者是找一个视频课,想要从头到尾跟着做,但结果不是做不完放弃,就是看完之后感觉到还是什么都不会。 这一周我发现了编程学习中那百分之二十产生效益的地方在哪,因此将改善学习方法,提升效率。 简要地说,编程学习的那百分之二十飞速提升效率的地方就在代码上。这听起来很荒谬,编程不就是写代码吗?但在实际的学习中,我确实时常犯下这个错误,就是绝大多数的精力并没有放在代码上。 我思考了一下改善学习的流程: 在资料充分的情况下,理当先拿到源代码,然后查看源代码的输入和输出。搞清楚这一段源代码的效果是什么. 然后接下来对源代码写注释,逐行搞清楚源代码中每一句的意思,并且借此补充知识,不需要记忆,就是通过注释写明就好了。 搞清楚原理,然后写作出来。尝试清楚明确地讲明白这段代码背后的概念是什么,原理是什么。 做完这三步之后马上循环写下一个项目,以项目到项目的方式来进展,试图把前面写过的项目追加到后面的项目中去,去连接学过的内容,并且就此复习。同样不需要记忆,只要查看原来写过的东西就好了了。

接下来的学习中将彻底实践此方法论,并且在下一个阶段评估学习的效率。 汇编子程序设计实验心得【篇2】 经过五天的Java实训,感触很深,收获也很大,对自己的缺点也有了很多的认识,回首本学期JAVA学习,重点还是在学习概念等一些常识性的东西,关于类型、变量、接口、输入输出流、分析异常、抛出异常,后期主要是小程序运用,Gui界面设计和事件。 在我学习的语言中,我自己认为Java是一门比较强大的面向对象的编程语言,不仅仅是因为它的跨平台型还有它的较强的实用性,强悍的嵌入性。 本次实训主要是针对我们对项目流程不熟悉和对整体项目的把握不清楚,学习数据库的设计和表的建设以及表与表之间的联系,还有一些代码的编写,这些都是我们所不熟悉的也是我们最薄弱的部分。 通过这一周的实训,虽然实训的时间不长,但是总体上收获挺大的,当我们正式准备学习实训java编程技术时,让我感到非常高兴,因为java一直学的是课本知识,所以实训对于我来说是必须要学会熟练操作的。当然开始学习后也并非是想象中那样顺利,开始的学习让我异常感到学习任务的.艰巨,因为学习中我遇到了很多以前未曾遇到的难点,有时后也难免会失去耐心,但是,通过老师的指导,自己的努力的练习,我顺利的化解了一道道的障碍。克服了Java学习上的一道道难关,现在自己已经基本掌握了java的基础知识。 有些知识点以前没有学过,但我也没有去研究,实训时突然间觉得自己真的有点无知,虽然现在去看依然可以解决问题,但要浪费许多时间,这一点是我必须在以后的学习中加以改进的地方,同时也要督促自己在学习的过程中不断的完善自我。另外一点,也是在实训中必不可少的部分,就是同学之间的互相帮助。所谓”当局者迷,旁观者清”,有些东西感觉自己做的是时候明明没什么错误,偏偏程序运行时就是有错误,让其他同学帮忙看了一下,发现其实是个很小的错

汇编程序设计实验报告(循环和子程序)

汇编程序设计实验报告(循环和子程序) 汇编语言程序设计 实验报告 一实验目的 1. 掌握宏的用法,宏参数、宏中标号的用法。 2. 掌握宏与子程序的异同点。 3. 掌握主程序与宏之间的调用关系及其调用方法 二实验内容 1. 在数据段中定义两字符串src1 和src2,用数据串传送的方式分别将两字符串传送到dst1 和dst2,数据串传送用宏指令实现。 2. 自定义两组各有三个无符号字节数据,求每组当中数据的最大数,求最大数的 方法用宏指令实现。注意local 标号的用法。 3. 编写一个数值计算的宏,它的作用是计算从1+2+……+n 的值。编写主程序调用该宏,计算当n=50,和n=100 时的计算结果,并以十进制字符串的形式输出。 4. 编写一个字符串处理的宏,它的作用是将字符串反转。例如,把字符串“ABCD”反转成“DCBA”。该宏的参数就是字符串的地址。字符串以0 作为结尾。 三详细设计

1 程序流程图 (1)字符串传送 主程序: 宏: (2)求最大数 主程序: 宏: (3)计算1+2+……+n 的值主程序: 计算1+2+……+n 的值的宏: 负责以十进制输出的子程序: (4)字符串反转 主程序: 宏:

四. 代码实现 (1)字符串传送 data segment src1 db 'i am a student' src2 db 'i am a teacher' data ends extra segment dst1 db 20 dup(0) dst2 db 20 dup(0) extra ends chuansong macro s1,s2,amount lea si,s1 lea di,s2 mov cx,amount cld rep movsb endm code segment 'code' assume cs:code,ds:data,es:extra start: mov ax,data mov ds,ax mov ax,extra mov es,ax

汇编语言子程序设计实验心得(精选5篇)

汇编语言子程序设计实验心得(精选5篇)汇编语言子程序设计实验心得篇1 做了两周的课程设计,有很多的心得体会,更多的是同学之间的合作精神,这道课程设计花了我们一到两周的时间,几人合作,老师的帮忙才完成。我第一次完成这么完美的杰作,心理有一份别样的滋味,在设计过程中,我付出了很多,也懂得了只有付出才有回报。在这次设计中,我遇到了很多困难,但我没有向困难低头,通过查询资料,虚心向同学、老师请教,才一一得到了解决。我发现平时学的太少了,在今后我首先要把老师在课堂讲的弄懂,弄透,在此基础上利用课余时间多看课外书籍,拓宽知识面。在设计过程中,合作精神必不可少。单凭一个人的力量是不能完成的,毕竟一个人学的很有限。每个人掌握的不同。我相信:态度决定一切,只有努力才有收获。 第一天上机时对如何编计数器程序一点头绪都没有,只是将从图书馆借来的关于如何制作图形看了一遍,大体上有了了解。 第二天我就着手画计数器图形,虽然有些人图形已画好,可我没有着急,毕竟别人花的时间比我多,为了使图形美观我不断运行、调试,直到自己满意为止。 接下来是星期五,说实话那天蛮难熬的,一天都泡在机房。眼睛有点吃不消,可没有办法,将来我们就靠计算机吃饭,再苦再累也要坚持。在已编好的程序上又加了一点精髓,怎样使字符闪烁,这也是我们几个人互相讨论的结果。 第二周,通过周末到网上查的资料,和参考资料又加入计数器的灵魂算法。 接下来几天再将程序不断完善、加工,计数器程序初露头角。 最后小结:程序设计过程有如解决一实际问题,从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方

实验五汇编语言程序设计实验(一)

实验五汇编语言程序设计实验〔一〕 一、实验目的 1、理解和掌握汇编语言子程序和主程序的设计。 2、掌握循环程序的设计。 3、掌握汇编语言主程序与子程序的调用和参数传递。 4、进一步熟悉在PC机上建立,汇编,链接,调试和运行8086、 8088汇编语言程序的过程。 二、实验内容 1、复习汇编语言源程序的上机过程: 2、编写一个完好程序〔包含循环设计和子程序设计〕 在以strg为首地址的缓冲区中存放着1个字符串,以-1作为完毕标志,编程统计字符串长度,并将结果存入lenth单元。要求统计字符串用子程序完成。 data segment strg db ‘abcd’,-1 lenth dw ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax lea dx,strg

call scount mov lenth,bx mov ah,4ch int 21h scount proc near push si xor bx,bx mov si,dx next:cmp byte ptr[si],-1 jz over inc bx inc si jmp next over:pop si ret scount endp code ends end start 三、实验器材 IBM PC 微机一台 四、实验要求 1、正确理解本次实验的目的,内容和原理。

2、能编写相应的程序 五、实验报告要求 完成下面任务:从键盘输入1个长度小于100的字符串,存入以buff 为首地址的缓冲区,其中如有大写字母,要求用子程序转换成小写字母,字符串以回车键作为完毕。写出操作步骤,程序清单,程序注释,实验现象。

汇编语言-实验五 输入输出程序设计

实验五输入输出程序设计 一、实验目的 1) 掌握输入输出程序的编写方法。 2) 熟悉系统功能调用的方法。 3) 熟悉动画程序的编写方法。 二、实验内容 1)在CRT上每隔一秒连续显示字符0-9。 编程提示 为了使输出的字符之间有空格,在每一个循环中输出一个0-9的字符和一个空格。为了输出0-9,置寄存器BL初值为0,每循环一次使其增量。为了保证输出是十进制,增量后用DAA调整指令。由于输出为一位十进制数,用AND 0FH 指令屏蔽高4位。 2)用系统功能调用将‘HELLO’由键盘输入,再从屏幕输出‘***HELLO***’。 3)编制在屏幕上画线的子程序,调用该子程序画一矩形。 4)编制字母下落一行的子程序,调用该子程序使字母从屏幕顶部下落到底部。 5)创建一磁盘文件,保存从键盘输入的字符串。 6)编写程序用设置系统时间,首先从键盘以十进制数形式输入时间,然后修改系统时间,并重新以十进制形式显示时间。 7)编写程序将屏幕分割成格状,每一格涂上不同颜色,格数从键盘输入。 8)编写程序在屏幕上显示菜单,输入相应菜单的序号后,选种该菜单项。 三、源程序 EXAM5-1 STACK SEGMENT STACK DB 1024 DUP(0)

STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK START:MOV BL,0 LP:MOV DL,20H MOV AH, 2 INT 21H MOV AL,BL ADD AL, 0 DAA AND AL,0FH MOV BL,AL PUSH BX OR AL,30H MOV DL,AL MOV AH, 2 INT 21H MOV BX,3E8H LP2:MOV CX,176H ;延时1ms LP1:PUSHF POPF LOOP LP1 DEC BX JNZ LP2 POP BX INC BL JMP LP CODE ENDS END START 执行程序EXAM5-1·EXE,屏幕上依次循环显示一个数字一个空格: 0 1 2 3 4 5 6 7 8 9 …… EXAM5-2 STACK SEGMENT STACK DB 1024 DUP(0) STACK ENDS DA TA SEGMENT BUFF DB 6,7 DUP(?),‘$’ DA TA ENDS INPUT MACRO BUFE MOV DX,OFFSET BUFE MOV AH,0AH INT 21H ENDM

汇编实验 子程序设计

实验五子程序结构设计 一、实验目的 1、加深对子程序的理解,掌握子程序的结构。 2、掌握子程序的设计、编写及调试方法。 3、掌握宏定义及宏调用的方法。 二、实验内容 1、已知在内存数据段中GRADE开始单元连续存放着10个学生的成绩,试 采用子程序结构编程实现以下功能: (1)找到最高成绩,将其偏移地址存放在内存单元MAX中。 (2)统计不及格的人数,存放在内存单元COUNT中。 (3)计算平均成绩(只取整数部分),并在屏幕上显示。 要求:将以上功能分别写成子程序,数据区定义如下 DSEG SEGMENT GRADE DB 76,68,54,80,45,92,63,58,94,85 MAX DW ? COUNT DB ? DSEG ENDS 源代码: DATAS SEGMENT GRADE DB76,68,54,80,45,92,63,58,94,85 MAX DW? COUNT DB? DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS MAIN PROC FAR START: PUSH DS MOV AX,0 PUSH AX

MOV AX,datas MOV DS,AX CALL MAXGRADE CALL BUJIGE CALL A VGRADE RET MAIN ENDP MAXGRADE PROC FAR push ax push cx push si mov cx,10 mov ax,0 mov si,ax start_loop: mov ax,word ptr grade[si] cmp ax,word ptr grade[si+1] jge big mov ax,word ptr grade[si+1] big: inc si loop start_loop mov max,ax pop si pop cx pop ax ret MAXGRADE ENDP BUJIGE PROC FAR PUSH SI PUSH CX PUSH AX MOV AX,0 MOV COUNT,0 MOV CX,10 LOOP_START2: MOV AX,WORD PTR GRADE[SI] CMP AX,60 JG SMALL2 INC COUNT SMALL2: INC SI LOOP LOOP_START2 POP AX POP CX

实验五汇编实验报告子程序设计

实验五子程序设计 1.实验目的和要求 1、学习子程序的编写,主子程序的调用 2、不同模块间程序的调用和调试 2.实验环境 实验的硬件环境是: IBM—PC机及其兼容机 实验的软件环境是: 操作系统:DOS 2.0以上;调试程序:https://www.360docs.net/doc/0019454904.html,;文本编程程序: EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;交叉引用程序:CREF.EXE(可有可无)。 3.实验内容及实验数据记录 1、数据段中的3个字符,调用子程序将其逐个显示出来。子程序的功能是显示一个字符。单步执行,观察IP的变化 DATA SEGMENT MAG DB ‘ABC’ DATA ENDS CODE SEGMENT

ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS, AX MOV SI, 0 MOV CX, 3 LL: MOV DL, MAG[SI] CALL MADD INC SI LOOP LL MOV AH, 4CH INT 21H MADD PROC MOV AH, 02H INT 21H RET MADD ENDP CODE ENDS

END START 2、阅读S31.ASM和S32.ASM两个模块中的程序,并分别汇编,然后连接成一个可执行文件S31.EXE。 具体步骤如下: MASM S31.ASM(分别汇编) MASM S32.ASM LINK S31 S32 (将两个文件连接成为一个文件名为S31) S31.EXE (运行) 3、编程:利用主程序调用子程序,比较BUF1和BUF2缓冲区中不相等的字符,并将不相等的字符显示出来。(也可以将找到的不相等字符逐个显示,用INT 21H的02功能调用) 4、编程:子程序搜索指定字符缓冲区中是否有n,如果有用y替代。调用子程序将BUF1,BUF2,BUF3中的n全部用y替代 4.算法描述及实验步骤 3、比较不相同字符串代码: DATA SEGMENT BUF1 DB'HUIFEHJSHEGDC' LEN1=$-BUF1 BUF2 DB'HUISWHJSAWQDC'

实验报告 子程序设计实验

实验5 子程序实验 一.实验目的 1.掌握主程序与子程序之间的调用关系及调用方法; 2.掌握子程序调用过程中近程调用与远程调用的区别; 3.掌握通过堆栈转送参数的方法。 4. 掌握多模块程序设计方法 二.实验内容 1.将BUF开始的10个单元中的二进制数转换成两位十六进制数的ASCII码,在屏幕上显示出来。要求码型转换通过子程序HEXAC实现,在转换过程中,通过子程序DISP实现显示。 DATAS SEGMENT BUF DB 00000111B,00100001B,00100010B,00000011B,00000101B,10000010B,10010011B,00100100B, 11100010B,01010010B CAN DB $-BUF ;定义常量CAN DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS MAIN PROC FAR ;主程序块 START: MOV AX,DATAS MOV DS,AX MOV CL,10 LEA SI,BUF LOOP1: ;调用子程序语句 call HEXAC call DISP DEC CAN JNZ LOOP1 EXIT: MOV AH,4CH INT 21H MAIN ENDP HEXAC PROC NEAR ;二进制转换成十六进制子程序 MOV BL,[SI] INC SI RET HEXAC ENDP

DISP PROC NEAR ;显示子程序 MOV CL,4 MOV CH,2 MOVE: ;移位语句 ROL BL,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,'9' JBE PRINT ADD DL,07H PRINT: MOV AH,02H ;显示语句 INT 21H DEC CH JNZ MOVE MOV DL,' ' MOV AH,02H INT 21H RET DISP ENDP CODES ENDS END START 2.编写一个主程序,从键盘接收若干个字符,然后用远调用的方法,调用子程序统计字符串中字符’b’的个数.子程序的参数是字符串的首地址TABLE,字符串长度N及字符”b”.子程序返回字符"b”的个数.参数传送采用堆栈实现.主程序在子程序返回后,显示字符”b”及其个数(设为一位十六进制数)。 DATA SEGMENT STR1 DB 0ah,0dh,'PLEASE INPUT YOUR STRING:$' STR2 DB 0ah,0dh,'THE NUMBER OF b is:$' TABLE DB 50, ? ,50 DUP(?),'$' DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,9 INT 21H LEA DX,TABLE

宏指令及子程序设计实验

实验五:宏指令及子程序设计实验院系名称:电子工程学院

学生姓名:李倩(33) 专业名称:电子信息工程 班级:电子0808 宏指令及子程序设计实验 5.5.1 实验目的 1、熟悉宏指令、宏定义、宏调用以及宏展开的概念;掌握宏指令的定义与调用的方法。 2、掌握子程序的定义、调用以及调用程序与子程序之间参数的传递方法。 3、了解宏指令与子程序的异同以及各自的适用场合。 5.5.2 实验预习要求 1、复习宏指令的定义与调用方法。 2、复习过子程序的定义与调用方法。 3、根据“2.5.3 实验内容”中给出的流程图和程序框架编写源程序,以便上机调试。 4、从“2.5.4 实验习题”中任选一道题目,编写源程序,以便上机调试。 5.5.3 实验内容

从键盘输入10个无符号十进制数(小 于256),将其转换为二进制数并存放在 NUM字节型变量中,找出其中的最大数, 并将找出的最大数在屏幕上显示出来。 要求: ①在屏幕上显示字符串提示信息的 功能由宏指令DSTRING实现; ②将键盘输入的十进制数转换成二 进制数由子程序DTOB实现; ③在N个无符号字节型二进制数中找出最大数的功能由子程序FMAX实现; ④将一个无符号字节型二进制数转换为十进制数并在屏幕上显示的功能由子程序BTOAD实现。 程序运行结果如右图所示。 1、编程指导 (1)显示提示信息的宏指令DSTRING的编写 宏指令通常用于在程序中需要反复使用但所需指令条数又不是很多的情形;而对于需要经常使用且需要较多指令才能完成的功能通常通过子程序调用来实现。这是因为,从执行速度上看,由于子程序调用涉及到保护断点的操作,因此,子程序调用比宏调用执行时间相对要稍长一些;但从生成的可执行文件的大小方面考虑,子程序调用生成的文件要小一些。读者在进行汇编语言程序设计时,应综合考虑两者的利弊,以便进行合理选择。 下面给出实现提示信息显示的宏指令的定义: DSTRING MACRO STRING PUSH DX

相关主题
相关文档
最新文档