汇编语言程序设计实验篇 下载本文

内容发布更新时间 : 2024/12/25 13:02:40星期一 下面是文章的全部内容请认真阅读。

开始 从键盘输入字符到′z′ – AL + ′a′ →AL 显示AL中的内容 返回DOS 图 2-1字符输入输出的程序流程图

程序框架如下: data segment

pkey db \ ends

stack segment

dw 128 dup(0) ends

code segment start:

; set segment registers: mov ax, data mov ds, ax mov es, ax

从键盘输入一个字符的指令序列

根据流程图中转换算法编制的指令序列 用于显示结果的指令序列 lea dx, pkey mov ah, 9

int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h

mov ax, 4c00h ; exit to operating system. int 21h ends

end start ; set entry point and stop the assembler. 编写EXE TEMPLATE程序(提示:计算’z’-al+’a’时,需要用sub指令),观察执行结果。

(2)字符串的输入和输出

从键盘输入一个字符串(以下说明中,假定键盘缓冲区的名字为KBUF,要显示的字符串变量名为STR),将输入的字符串传送给STR变量,在屏幕上显示STR变量中的内容。

程序流程图如错误!未找到引用源。所示。

开始 从键盘输入字符串到KBUF 将KBUF中的字符串传送到变量STR中: 1.字符串长度传送到CX +2的偏移地址→SI,STR的偏移地址→DI 3.循环传送字符串中的每个字符(循环次数在CX中) 显示INFO中的内容 返回DOS 图 2-2字符串输入输出的程序流程图

程序框架如下: data segment

KBUF db 20, 0, 20 dup(20h) STR db 20 dup(20h), ′$′ pkey db \ ends

stack segment

dw 128 dup(0) ends

code segment start:

; set segment registers: mov ax, data mov ds, ax mov es, ax

从键盘输入字符串的指令序列 将KBUF传送到STR的指令序列 显示STR内容的指令序列 lea dx, pkey mov ah, 9h

int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h

mov ax, 4c00h ; exit to operating system. int 21h ends

end start ; set entry point and stop the assembler.

编写EXE TEMPLATE程序(提示:CX的初始值不为0),观察执行结果。

5. 实验习题

1)对实验内容1,在程序中增加显示提示字符串\input a lowercase letter\和\The inverse letter is:\,修改程序并上机验证。 2)对实验内容2,在程序中增加显示提示字符串\input a string\和\string you input is:\,修改程序并上机验证。

6. 实验报告要求

1)整理源程序段和运行结果。

2)说明DOS系统功能调用的10号功能对键盘缓冲区格式上有何要求。

3)DOS系统功能调用中的1、2、9、10号功能的输入输出参数有哪些?分别放在什么寄存器中?

4)总结汇编语言程序中如何实现字符和字符串的输入输出。

1.2.6 顺序程序

1. 实验目的

1)了解8086汇编程序的基本结构; 2)掌握顺序程序的基本设计方法。

2. 实验设备

微型计算机、emu8086

3. 实验原理

顺序程序是控制流仅有一个走向的程序,它主要用于解决一些无需进行判断分支,也无需循环执行的简单问题。

本节的实验内容与乘法和除法运算有关。无符号数乘法运算使用MUL指令,有符号数乘法运算使用IMUL指令。乘法运算属于隐含操作数的运算,因此在使用乘法指令前,需要先将乘数放入AL(8位乘法)或AX(16位乘法)中。乘法指令执行后,乘积在AX(8位乘法)或DX:AX(16位乘法)中。无符号数除法运算使用DIV指令,有符号数除法运算使用IDIV指令。除法运算属于隐含操作数的运算,因此在使用除法指令前,需要先将被除数放入AX(8位除法)或DX:AX(16位除法)中。当除数为8位时,被除数应为16位;除数为16位时,被除数应为32位。对无符号数除法,当被除数字长不够时,高位部分可直接补0;而对有符号数除法,当被除数字长不够时,必须使用符号扩展指令进行扩展。除法运算执行后,结果在AX(8位除法)或DX:AX(16位除法),其中AL(8位除法)或AX(16位除法)中是商,AH(8位除法)或DX(16位除法)中是余数。

4. 实验内容

在NUM变量中定义了5个符号数(字节类型),分别是U= 09H,V=16H,W=04H,X=17H,Y=05H,计算(U+V -W*X)/Y,将结果显示在屏幕上。

程序流程图如错误!未找到引用源。。

开始 [NUM]=U,[NUM+1]=V, [NUM+2]=W,[NUM+3]=X,[NUM+4]=Y 第一步:计算W*X 1. [NUM+2]→AL(数据W送AL) 2. AL*[NUM+3]→AL(W*X乘积送AL) →BL(乘积备份到BL) 第二步:计算U+V-W*X 1. [NUM]→AL(数据U送AL) 2. AL+[NUM+1]→AL(U+V之和送到AL) 3. AL-BL→AL(U+V-W*X,结果送到AL) 第三步:计算(U+V-W*X)/Y 1. AL符号扩展到AX 2. AX / [NUM+4]→AX ((U+V-W*X)/Y,商在AL中) 第四步:显示结果的高4位 1. AL中的结果暂存到BL 2. AL逻辑右移4位(取高4位) 3. AL的内容转换成ASCII码 4. 显示 第五步:显示结果的低4位 1. BL中暂存的结果送到AL 2. 保留AL中低4位,高4位清0 3. AL的内容转换成ASCII码 4. 显示 返回DOS 图 2-3顺序程序的程序流程图

程序框架如下: data segment

NUM db 09,16h,04h,17h,05h ;定义U,V,W,X,Y pkey db \ ends

code segment start:

; set segment registers: mov ax, data mov ds, ax mov es, ax lea si,NUM

;计算W*X,结果保存到al中 mov bl, al

;计算U+V,结果保存到al中 ;计算U+V-W*X,结果保存到al中 cwb

;计算(U+V-W*X)/Y mov bl,al

;显示结果的高4位 ;显示结果的低4位 lea dx, pkey mov ah, 9

int 21h ; output string at ds:dx ; wait for any key.... mov ah, 1 int 21h

mov ax, 4c00h ; exit to operating system. int 21h ends

end start ; set entry point and stop the assembler. 编写EXE TEMPLATE程序,观察执行结果。

5. 实验习题

将数据改为U=0ABH,V=0EFH,W=12H,X=10H,Y=05H,上机验证结果是否正确?问题出在何处,应如何解决?

6. 实验报告要求

1)写出完整的程序。

2)使用不同数据测试程序并解释运行结果。

1.2.7 分支程序

1. 实验目的

1)了解8086汇编程序的基本结构; 2)掌握分支程序的基本设计方法。