内容发布更新时间 : 2024/11/16 0:43:56星期一 下面是文章的全部内容请认真阅读。
第二题:
第三题:
五. 实验体会
1. 汇编中的分支、循环只能通过跳转实现。 2. 地址表是实现多分支结构的常用方法。
实验三 循环和子程序设计
一. 实验目的
1、掌握循环程序和子程序的设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二. 实验内容
1. 在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N” 。
2. 从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:查找中间是否有‘asm’子串。如果有,输出‘Yes’;否则,输出‘No’)。
3. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数内存数)。要求通过堆栈(寄存器、内存)传送所有参数。(要求输入输出实现,且有提示)
三. 实验过程和程序
第一题:
stack segment stack dw 512 dup(0) stack ends
data segment
Score db 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 db 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 db 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 db 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 db 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 db 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 db 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 db 90, 91, 92, 93, 94, 95, 96, 97, 98, 99
db 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 db 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 NextLine db 0DH, 0AH, '$' Tip db 'Input a number:', '$' No db 'N', 0DH, 0AH, '$' Yes db 'Y', 0DH, 0AH, '$' InputBuf db 4, ?, 8 dup('$')
data ends
code segment
assume cs:code, ds:data, ss:stack start:
mov ax, data mov ds, ax
; 打印提示信息 lea dx, Tip mov ah, 09H int 21H
; 获取用户的输入,放在al sub sp, 2 call GetNum pop ax
; 扫描Score lea bx, Score mov cx, 100 L:
cmp al, [bx] ; 若[bx] == al, 找到 je Found inc bx loop L
; 循环没有中断,没找到,打印'No' lea dx, No jmp OutPut Found:
lea dx, Yes jmp OutPut OutPut:
mov ah, 09H int 21H Exit:
mov ah, 4CH int 21H
; 参数: 无
; 返回值: 8位无符号数 GetNum proc far push ax push bx push cx push dx push bp mov bp, sp
lea dx, InputBuf
mov ah, 0AH int 21H mov dl, 10 xor ax, ax
lea bx, InputBuf[2]
mov cl, InputBuf[1] ;设置CX xor ch, ch Next_GetNum: mul dl
mov dh, [bx] sub dh, '0' add al, dh inc bx
loop Next_GetNum xor ah, ah
mov ss:[bp+14], ax lea dx, NextLine mov ah, 09H int 21H pop bp pop dx pop cx pop bx pop ax ret
GetNum endp code ends end start
第二题:
stack segment stack dw 512 dup(0) stack ends
data segment
StrBuf db 50, ?, 50 dup('$'), '$'
Tip1 db 'Input a string:', 0DH, 0AH, '$' Tip2 db 'You input:', 0DH, 0AH, '$' No db 'No', 0DH, 0AH, '$' Yes db 'Yes', 0DH, 0AH, '$' NextLine db 0DH, 0AH, '$' data ends
code segment
assume cs:code, ds:data, ss:stack start:
mov ax, data mov ds, ax call GetLine
lea bx, StrBuf[2] ;BX为字符串首地址 L_BEGIN: ; 每次循环的开始
cmp byte ptr [bx], '$' ; 如果[bx]是'$',字符串已经结束,跳出循环 je L_END
cmp byte ptr [bx], 'a' ; 若[bx]是'a',比较[bx+1]是不是's' jne NEXT
cmp byte ptr [bx+1], 's' jne NEXT
cmp byte ptr [bx+2], 'm'; 若[bx+2]是'm',找到了'asm',跳出循环 je L_END NEXT:
inc bx
jmp L_BEGIN L_END:
cmp byte ptr [bx], '$' ;若[bx]=='$',则没找到'asm',否则就是找到了 jne Found lea dx, No jmp OutPut Found:
lea dx, Yes jmp OutPut OutPut:
mov ah, 09H int 21H Exit:
mov ah, 4CH int 21H
GetLine proc far push ax push bx push dx
; 打印输入提示 lea dx, Tip1 mov ah, 09H int 21H
; 获取用户输入 lea dx, StrBuf mov ah, 0AH