汇编程序设计 分支结构的程序设计 实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该转移指令的执行不影响任何标志位。 2.无符号数的条件转移指令(Jumps Based on Unsigned (Logic) Data)
6
图 5-5 无符号数的条件转移指令
3. 在编写分支程序时,要尽可能避免编写“头重脚轻”的结构,即:当前分支条件成立时,
将执行一系列指令,而条件不成立时,所执行的指令很少。这样就使后一个分支离分支点较 远,有时甚至会遗忘编写后一分支程序。这种分支方式不仅不利于程序的阅读,而且也不便 将来的维护。
mov al,string ;若只输入 1 位数字月份值,则读出该值
and al,0fh
;把 ASCII 码转换为对应数字
jmp jisuan
da10:
mov al,string
and al,0fh
;把月份数值十位的 ASCII 码转换为对应数字(如 12 月的 1 字)
mov bl,10
mul bl
and string[1],0fh ;把月份数值个位的 ASCII 码转换为对应数字
add al,string[1] ;十位加上个位 (如 12 月)
jisuan:
;以下计算偏移地址
cmp al,1 ;比 1 小是非法月份
jb shuruerr ;若月份值小于 1 则转出错处理
cmp al,12
ja shuruerr ;比 12 大也是非法月份
JMP 指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个 短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内) 或远(far)转移(在不同的代码段之间转移)。
短和近转移是段内转移,JMP 指令只把目标指令位置的偏移量赋值指令指针寄存器 IP, 从而实现转移功能。但远转移是段间转移,JMP 指令不仅会改变指令指针寄存器 IP 的值, 而且还会改变代码段寄存器 CS 的值。
mov ah,09h
int 21h
;显示提示信息
lea dx,buffer
mov ah,0ah
int 21h
;输入月份数值
cmp actlen,0 ;若没有输入月份则转出错处理
je shuruerr
;以下判断输入月份是否合法
3
lea di,string
cmp actlen,2
je da10
;若输入的是 2 位数月份值则转到 da10 标号处执行
buffer label byte ;定义输入月份的输入缓冲区
maxlen db 3
;最多 2 个数字,包括一个回车
actlen db ?
;保存实际输入的字符个数
string db 3 dup(?) ;保存输入的月份数字内容(ASCII 码)
.code
.startup
shuru:
;开始输入月份编号
lea dx,msg1
1
《汇编语言程序设计》
实验报告
2
实验五 分支结构程序设计
实验目的
1、掌握利用无条件转移指令JMP和有条件转移指令实现多分支程序的设计方法。 2、掌握用DOS的中断调用,实现在程序执行过程中从键盘动态输入字符串的方法。 3、掌握程序中标号的定义和使用。
实验内容
实现从键盘输入一个月份数值(1-12),根据输入的月份数值显示相应的月份英文单词 缩写,如输入5则显示May。
sub al,1 ;月份值减 1
shl al,1
shl al,1 ;月份再乘 4 对应了 MON 字符串中从首地址开始的字符相对位置
xor ah,ah ;1 月份从 0 位置开始即 JAN,...5 月份从位置 16 开始即 MAY
lea si,mon ;找到被显示月份字符的位置
add si,ax
mov cx,3
;取字符串的首地址
MOV AH,09H
;系统调用功能号送 AH
INT 21H
此调用的入口参数为内存缓冲区中字符串的首地址,该字符必须以‘$’结尾,出口参 数无,调用执行结果是在屏幕上显示一个字符串
5.分支结构的两种结构:
图 5-6 分支结构的两种结构
5
图 5-2 编译通过 2、程序汇编通过后,运行程序察看输出结果。
图 5-3 程序运行结果 3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。
实验体会
图 5-4 直接回车或输入非法月份值观察输出
1.无条件转移指令JMP(Uncondit来自百度文库onal Jump): JMP指令的一般形式: JMP 标号/Reg/Mem
output: mov dl,[si] ;输出对应月份英文缩写
mov ah,2
int 21h
inc si
loop output
.exit 0
shuruerr: lea dx,msg2 ;输入出错时提示出错,并转到程序起始处重新执行
mov ah,09h
int 21h
jmp shuru
end
4
图 5-1 键入代码
实验步骤
1、编辑下列程序:
.model small
.stack
.data
mon db 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'
msg1 db 'Please input a month(1-12) :',13,10,'$'
msg2 db 'Input error! Now try again...',13,10,'$'
所以,在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的 情况,也可遵循“由易到难”的原则。因为简单的分支只需要较少的指令就能处理完,一旦 处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支;
4.在屏幕上从当前光标位置开始显示一个字符串:
MOV DX,OFFSET STRING
6
图 5-5 无符号数的条件转移指令
3. 在编写分支程序时,要尽可能避免编写“头重脚轻”的结构,即:当前分支条件成立时,
将执行一系列指令,而条件不成立时,所执行的指令很少。这样就使后一个分支离分支点较 远,有时甚至会遗忘编写后一分支程序。这种分支方式不仅不利于程序的阅读,而且也不便 将来的维护。
mov al,string ;若只输入 1 位数字月份值,则读出该值
and al,0fh
;把 ASCII 码转换为对应数字
jmp jisuan
da10:
mov al,string
and al,0fh
;把月份数值十位的 ASCII 码转换为对应数字(如 12 月的 1 字)
mov bl,10
mul bl
and string[1],0fh ;把月份数值个位的 ASCII 码转换为对应数字
add al,string[1] ;十位加上个位 (如 12 月)
jisuan:
;以下计算偏移地址
cmp al,1 ;比 1 小是非法月份
jb shuruerr ;若月份值小于 1 则转出错处理
cmp al,12
ja shuruerr ;比 12 大也是非法月份
JMP 指令是从程序当前执行的地方无条件转移到另一个地方执行。这种转移可以是一个 短(short)转移(偏移量在[-128, 127]范围内),近(near)转移(偏移量在[-32K, 32K]范围内) 或远(far)转移(在不同的代码段之间转移)。
短和近转移是段内转移,JMP 指令只把目标指令位置的偏移量赋值指令指针寄存器 IP, 从而实现转移功能。但远转移是段间转移,JMP 指令不仅会改变指令指针寄存器 IP 的值, 而且还会改变代码段寄存器 CS 的值。
mov ah,09h
int 21h
;显示提示信息
lea dx,buffer
mov ah,0ah
int 21h
;输入月份数值
cmp actlen,0 ;若没有输入月份则转出错处理
je shuruerr
;以下判断输入月份是否合法
3
lea di,string
cmp actlen,2
je da10
;若输入的是 2 位数月份值则转到 da10 标号处执行
buffer label byte ;定义输入月份的输入缓冲区
maxlen db 3
;最多 2 个数字,包括一个回车
actlen db ?
;保存实际输入的字符个数
string db 3 dup(?) ;保存输入的月份数字内容(ASCII 码)
.code
.startup
shuru:
;开始输入月份编号
lea dx,msg1
1
《汇编语言程序设计》
实验报告
2
实验五 分支结构程序设计
实验目的
1、掌握利用无条件转移指令JMP和有条件转移指令实现多分支程序的设计方法。 2、掌握用DOS的中断调用,实现在程序执行过程中从键盘动态输入字符串的方法。 3、掌握程序中标号的定义和使用。
实验内容
实现从键盘输入一个月份数值(1-12),根据输入的月份数值显示相应的月份英文单词 缩写,如输入5则显示May。
sub al,1 ;月份值减 1
shl al,1
shl al,1 ;月份再乘 4 对应了 MON 字符串中从首地址开始的字符相对位置
xor ah,ah ;1 月份从 0 位置开始即 JAN,...5 月份从位置 16 开始即 MAY
lea si,mon ;找到被显示月份字符的位置
add si,ax
mov cx,3
;取字符串的首地址
MOV AH,09H
;系统调用功能号送 AH
INT 21H
此调用的入口参数为内存缓冲区中字符串的首地址,该字符必须以‘$’结尾,出口参 数无,调用执行结果是在屏幕上显示一个字符串
5.分支结构的两种结构:
图 5-6 分支结构的两种结构
5
图 5-2 编译通过 2、程序汇编通过后,运行程序察看输出结果。
图 5-3 程序运行结果 3、程序运行中不输入月份值(直接回车),或输入非法月份值,观察程序执行的情况。
实验体会
图 5-4 直接回车或输入非法月份值观察输出
1.无条件转移指令JMP(Uncondit来自百度文库onal Jump): JMP指令的一般形式: JMP 标号/Reg/Mem
output: mov dl,[si] ;输出对应月份英文缩写
mov ah,2
int 21h
inc si
loop output
.exit 0
shuruerr: lea dx,msg2 ;输入出错时提示出错,并转到程序起始处重新执行
mov ah,09h
int 21h
jmp shuru
end
4
图 5-1 键入代码
实验步骤
1、编辑下列程序:
.model small
.stack
.data
mon db 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'
msg1 db 'Please input a month(1-12) :',13,10,'$'
msg2 db 'Input error! Now try again...',13,10,'$'
所以,在编写分支结构时,一般先处理简单的分支,再处理较复杂的分支。对多分支的 情况,也可遵循“由易到难”的原则。因为简单的分支只需要较少的指令就能处理完,一旦 处理完这种情况后,在后面的编程过程中就可集中考虑如何处理复杂的分支;
4.在屏幕上从当前光标位置开始显示一个字符串:
MOV DX,OFFSET STRING