实验二 基本程序设计

本文介绍了四个汇编语言程序设计的实例,涉及基本的算术运算、位操作、字符串处理及数组搜索。实验涵盖了顺序、循环、分支和函数结构,以及如何在PC上编译和运行8086/8088汇编程序。程序包括:数值计算、位测试、数组查找和字符串处理。同时,还展示了如何通过堆栈传递参数并以16进制输出计算结果。
摘要由CSDN通过智能技术生成

实验二 基本程序设计

一. 实验目的

1、掌握顺序、循环、分支、函数4种基本程序结构和设计方法;

2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。

二. 实验内容

1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:

(1)计算表达式值(V–(X*Y+Z-720))/X;

(2)将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。

2、BL中的只有一位为0,编写程序测试0所在的位数,并输出提示信息“The X Bit is 0”,要求使用地址表方法实现。

3、在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N” 。

\4. 从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串;查找该字符串中间是否有‘asm’子串,如果有,输出‘Yes’,否则,输出‘No’)。

\5. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字操作数,假设计算结果为16位,可以放在z中)。要求:(1)通过堆栈传送参数x和y;(2)将计算结果按照16进制输出到屏幕上。

三. 实验过程和程序

1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:

(1)计算表达式值(V–(X*Y+Z-720))/X;

(2)将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。

先编写代码,生成asm文件,使用dosbox的masm生成obj文件,如果有错误则进行再次编写直到没有错误为止重新编译,进行再用link生成exe文件。

*.model small*

*.stack*

*.data*

*x dw 10*

*y dw 2*

*z dw 700*

*v dw 20*

*sum1 dw ?*

*sum2 dw ?*

*.code*

*START: mov ax, @data*

*mov ds, ax*

*mov ax, x*

*imul y*

*add ax, z*

*adc dx, 0*

*sub ax, 720*

*sbb dx, 0*

*sub v,ax*

*sbb dx,0*

*not dx*

*idiv x*

*mov sum1, ax*

*mov sum2, dx*

*mov ax, 4c00h*

*int 21h*

*end START*

2、BL中的只有一位为0,编写程序测试0所在的位数,并输出提示信息“The X Bit is 0”,要求使用地址表方法实现。

*data segment*

*address dw fun8,fun7,fun6,fun5,fun4,fun3,fun2,fun1*

*string8 db ‘The 8 bit is 1$’*

*string7 db ‘The 7 bit is 1$’*

*string6 db ‘The 6 bit is 1$’*

*string5 db ‘The 5 bit is 1$’*

*string4 db ‘The 4 bit is 1$’*

*string3 db ‘The 3 bit is 1$’*

*string2 db ‘The 2 bit is 1$’*

*string1 db ‘The 1 bit is 1$’*

*data ends*

*assume ds:data, cs:code*

*code segment*

*start:*

*mov ax, data*

*mov ds, ax*

*mov bl, 10H*

*mov ax, 0000H*

*mov cx, 8*

*math:* *shl bl, 1*

*jc right*

*jmp next*

*right:* *mov dl, 02H*

*mul dl*

*mov bp, ax*

*jmp address[bp]*

*next:* *inc ax*

*loop math*

*fun8:* *mov dx, offset string8*

*jmp cout*

*fun7:* *mov dx, offset string7*

*jmp cout*

*fun6:* *mov dx, offset string6*

*jmp cout*

*fun5:* *mov dx, offset string5*

*jmp cout*

*fun4:* *mov dx, offset string4*

*jmp cout*

*fun3:* *mov dx, offset string3*

*jmp cout*

*fun2:* *mov dx, offset string2*

*jmp cout*

*fun1:* *mov dx, offset string1*

*jmp cout*

*cout:* *mov ah, 09H*

*int 21H*

*mov ah, 4ch*

*int 21H*

*code ends*

*end start*

3、在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N” 。

*stack segment stack*

*dw 512 dup(?)*

*stack ends*

*data segment*

*score db 21H,61H,4AH,63H,5AH,60H,5CH,5DH,49H,4EH,90 DUP(12H)*

*yes db ‘Y’,’$’*

*no db ‘N’,’$’*

*data ends*

*code segment*

*assume cs:code,ds:data*

*start:mov ax,data*

*mov ds,ax*

*mov ah,1*

*INT 21H*

*and al,0FH*

*mov bl,10*

*mul bl*

*mov bl,al*

*mov ah,1*

*int 21H*

*and al,0FH*

*add bl,al*

*mov cx,63H*

*mov si,offset score*

*while:cmp [si],bl*

*jz print_yes*

*add si,1*

*loop while*

*mov dx,offset no*

*mov ah,09h*

*int 21H*

*jmp done*

*print_yes:*

*mov dx,offset yes*

*mov ah,09h*

*int 21H*

*done:*

*mov ah,4ch*

*int 21h*

*code ends*

*end start*

\4. 从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串;查找该字符串中间是否有‘asm’子串,如果有,输出‘Yes’,否则,输出‘No’)。

*STRING DB 50, 0, 50 DUP(?)*

*YES DB ‘Yes’, 0ah, 0dh, ‘$’*

*NO DB ‘No’, 0ah, 0dh, ‘$’*

*search DB ‘asm’*

*NEW DB 0dh, 0ah, ‘$’*

*DATA ENDS*

*CODE SEGMENT*

*ASSUME CS:CODE, DS:DATA*

*START:*

*MOV AX, DATA*

*MOV DS, AX*

*MOV AX, DATA*

*MOV ES, AX*

*LEA DX, STRING*

*MOV AH, 0AH*

*INT 21H*

*LEA DX,NEW*

*MOV AH,9*

*INT 21H*

*LEA DX,STRING+2*

*MOV AH,9*

*INT 21H*

*LEA DX,NEW*

*MOV AH,9*

*INT 21H*

*LEA SI,STRING+2*

*LEA DI,search*

*MOV DX,SI*

*MOV BX,DI*

*MOV AL,50*

*again:*

*MOV CX,3*

*REPZ CMPSB*

*JZ FOUND*

*INC DX*

*MOV SI,DX*

*MOV DI,BX*

*DEC AL*

*JNZ again*

*LEA DX,NO*

*MOV AH,9*

*INT 21H*

*JMP EXIT*

*FOUND:*

*LEA DX, YES*

*MOV AH, 09H*

*INT 21H*

*EXIT:*

*MOV AX, 4C00H*

*INT 21H*

*CODE ENDS*

*END START*

\5. 编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字操作数,假设计算结果为16位,可以放在z中)。要求:(1)通过堆栈传送参数x和y;(2)将计算结果按照16进制输出到屏幕上。

*assume cs:code,ds:data,ss:stack*

*data segment*

*a db “input:x y$”*

*x1 db “x=$”*

*y1 db “y=$”*

*z1 db “z=$”*

*new db 0dh,0ah,"$"*

*x dw ?*

*y dw ?*

*z dw ?*

*data ends*

*stack segment*

*db 16 dup(0)*

*stack ends*

*code segment*

*start:mov ax,data*

*mov ds,ax*

*mov ax,stack*

*mov ss,ax*

*mov sp,16 ;初始化*

*mov dx,offset a*

*mov ah,9*

*int 21h*

*lea dx,new*

*mov ah,9*

*int 21h*

*lea dx,x1*

*mov ah,9*

*int 21h ;换行输入x*

*mov ah,1*

*int 21h*

*lea si,x*

*sub al,30h*

*mov [si],al*

*lea dx,new*

*mov ah,9*

*int 21h*

*lea dx,y1 ;输入y*

*mov ah,9*

*int 21h*

*mov ah,1*

*int 21h*

*lea si,y*

*sub al,30h*

*mov [si],al*

*lea dx,new*

*mov ah,9*

*int 21h ;开始调用子程序*

*sub sp,2*

*push x*

*push y*

*call f*

*pop z*

*lea dx,z1*

*mov ah,9*

*int 21h*

*mov ax,z*

*and ax,0fh*

*mov dl,al*

*add dl,30h*

*mov ah,2*

*int 21h*

*mov ah,4ch*

*int 21h*

*f proc*

*push bp*

*mov bp,sp*

*push ax*

*push bx*

*push dx*

*mov ax,[bp+6]*

*mov bx,[bp+4]*

*imul bx*

*add ax,[bp+6]*

*adc dx,0*

*sub ax,[bp+4]*

*sbb dx,0*

*mov [bp+8],ax*

*mov [bp+10],dx*

*pop dx*

*pop bx*

*pop ax*

*pop bp*

*ret 4*

*f* *endp*

*code ends*

*end start*

四. 实验结果(包括必要的截图)

img

img

image-20210606202545544

image-20210606202559260

img

img

img

img

img

img

img

img

img

5.编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字操作数,假设计算结果为16位,可以放在z中)。要求:(1)通过堆栈传送参数x和y;(2)将计算结果按照16进制输出到屏幕上。

img

img

img

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值