实验目的及内容
理解循环程序结构的特点,掌握循环结构程序的编写。
一.单层循环实验
(1) 验证循环结构的斐波那契数列程序(教材例4-18),给出最后一个显示的数字。编写求最大N值的自然数求和程序(循环结构),具体要求是:进行自然数相加(1+2+3+……+N),如果(无符号整数的)累加和用一个32位寄存器存储,求出(显示)有效累加和的最大值及对应的最大N值。
1.斐波那契数列
include io32.inc
.data
.code
start:
mov eax,1 ;首元素为1
call dispuid ;显示元素
call dispcrlf ;换行
call dispuid ;显示元素
call dispcrlf ;换行
mov ebx,eax ;次元素也为1
again:
add eax, ebx ;前二元素加和
jc done ;超出32位进位范围为止
call dispuid ;显示元素
call dispcrlf ;换行
xchg eax,ebx ;eax和ebx数据互换,进行下一轮累加和
jmp again
done: exit 0
end start
运行结果:
2.自然数累加和
include io32.inc
.data
overmsg byte 'The SUM and N is: '
.code
start: mov eax,1
mov ebx,0
again:
mov ecx,eax
add eax,ebx
jc over
call dispuid
call dispcrlf
inc ebx
jmp again
over:
mov eax, offset overmsg ;汇报越界语句
call dispmsg
dec ecx
mov eax, ecx ;汇报越界前有效累加最大和
call dispuid
call dispcrlf
dec ebx
mov eax, ebx ;汇报对应的最大N值
call dispuid
done: exit 0
end start
运行结果:
二.嵌套循环实验
验证多重循环的冒泡法排序程序(教材例4-19),编写显示ASCII表程序(教材习题4.27),并运行正确。
1.冒泡排序法
include io32.inc
.data
array dword 587,-632,777,234,-34
count = lengthof array
.code
start: mov ecx,count
dec ecx ;外循环起始次数为length-1
outcir: mov edx,ecx ;外循环起始
mov ebx,offset array ;数组指针
incir: mov eax,[ebx] ;按ebx中的地址去存储单元取数据
cmp eax,[ebx+4]
jng next ;如果arr[j]<arr[j+1],不交换位置
xchg eax,[ebx+4] ;否则交换位置
mov [ebx],eax ;完成位置交换
next: add ebx,4 ;下一个元素
dec edx ;内循环计数
jnz incir ;判断某一轮外循环中的内循环是否结束
loop outcir
ok: mov ecx,count
mov ebx,offset array
print:
mov eax,[ebx]
call dispsid
call dispcrlf
add ebx,4
loop print
done: exit 0
end start
运行结果:
2.输出ACSII码表
include io32.inc
.data
onemsg byte ' | 0 1 2 3 4 5 6 7 8 9 A B C D E F', 13,10 ;第一行内容
byte '--- + ', 31 dup ('-'),13,10,0
msg3 byte ' ',0
msg4 byte ' | ',0
msgtry byte 'here',0
priarr byte ?
.code
start: mov eax, offset onemsg
call dispmsg
mov ebx,0
mov edx,020h ;初始化
outcir:
mov eax,offset msg3
call dispmsg
mov eax,edx
call disphb ;显示前面的部分
mov eax,offset msg4
call dispmsg
incir:
cmp ebx,0fh ;判断该行打印条件
ja next ;大于15,顺序执行
mov eax,ebx ;否则打印该字符
add eax,edx
call dispc ;逐个打印字符
mov eax,020h ;打印ACSII间的空格
call dispc
inc ebx ;计数器
jmp incir
next:
call dispcrlf
;mov eax,offset msgtry
;call dispmsg
add edx,010h ;外循环每次自增010h
cmp edx,070h ;外循环结束条件
ja done
mov ebx,0
jmp outcir
done: exit 0
end start
运行结果: