实验二 基本程序设计
一. 实验目的
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*
四. 实验结果(包括必要的截图)
5.编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字操作数,假设计算结果为16位,可以放在z中)。要求:(1)通过堆栈传送参数x和y;(2)将计算结果按照16进制输出到屏幕上。