汇编上机实验

更新时间:2023-12-15 20:39:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

从键盘接收两个不大于5 的十进制数字,并以十进制数据形式显示其和。 编程提示:

该程序中要求的均为一位数据的输入输出,暂时不考虑多位数据,请输入0~5 之间的数据,显示的结果为0~9。请不要输入两个5,以免出现不能直接输出的情况。 data segment data ends code segment

assume cs:code,ds:data start:mov ax,data mov ds,ax mov ah,01h int 21h mov bl,al sub bl,30h ;将输入的数字变成16进制数后放在bl中 ;为了实现bl与cl的16进制数相加 mov dl,10 ;换行(10表示换行) mov ah,02h int 21h ;mov dl,13 ;回车(13表示回车,为的是让换行之后光标移到行首) ;mov ah,02h ;int 21h mov ah,01h int 21h mov cl,al sub cl,30h;将输入的数字变成16进制数后放在cl中 mov dl,10 mov ah,02h int 21h ;mov dl,13 ;mov ah,02h ;int 21h add cl,bl add cl,30h mov dl,cl mov ah,02h int 21h

mov ax,4c00h int 21h code ends end start

1、试编写程序,完成下面公式的计算。

A ←(X-Y+24)/ Z的商,B ←(X-Y+24)/ Z的余数

其中,变量X和Y是32位有符号数,变量A、B、Z是16位有符号数。 DATA SEGMENT X DD 12345H ORG 10H Y DD 12345H ORG 20H Z DW 12H ORG 30H A DW ? B DW ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,WORD PTR X ;将X低四位放入AX中 MOV DX,WORD PTR X+2 ;将X高四位放入DX中 SUB AX,WORD PTR Y ;X和Y的低四位相减(不考虑借位) SBB DX,WORD PTR Y+2 ;X和Y的高四位相减(考虑借位) ADD AX,24 ADC DX,0 ;只是将进位 加入到DX中 IDIV Z MOV A,AX ;存放商到A MOV B,DX ;存放余数到B MOV AX,4C00H INT 21H CODE ENDS END START

2 、试将字节数据B1 拆分成两个半字节数据,分别存放于其后两个单元X 和Y 中。 编程提示:

数据段定义应包含B1、X、Y 三个变量,其中B1 变量自定义具体的数值,X、Y 变量的数值由程序赋值,分别是B1 的高低半个字节。该程序中需要使用逻辑操作完成半字节数据的拆分。

DATA SEGMENT B1 DB 12H X DB ? Y DB ? DATA ENDS

CODE SEGMENT

ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX

MOV AL,B1 MOV CL,4 SHR AL,CL MOV X,AL MOV AL,B1 AND AL,0FH MOV Y,AL MOV AX,4C00H INT 21H CODE ENDS END START

1、试编写程序,完成以下功能。

(1)程序执行时,显示提示信息“Please input a string(length<9):”,由用户输入一个长度小于9的字符串;

(2)然后显示提示信息“Please input the index of the char to display:”,请用户指定该串中的某个字符的位置号;

(3)程序将用户指定位置的字符显示出来。

例如:用户输入一个字符串“ABCDEFG”,然后指定的位置号为2,则屏幕显示字符“C”。注意:这里的位置号从0开始。

注意:以上功能的实现不要求程序做控制判断,在字符串输入时,由人为控制字符串长度小于9;在指定位置号时,由人为控制输入的位置号是合法的。 2、试使用分支结构和循环结构程序完善上面的程序功能。

(1)对用户输入的字符串进行长度检查,若长度大于9,则要求用户重新输入;

(2)用户在指定位置号时,进行判断,若输入非法(位置号大于实际字符串长度),则提示用户重新输入;

(3)统计用户输入的字符串中特定字符的数目并显示。可先指定特定字符进行统计,然后再由用户指定字符进行统计。

DATA SEGMENT

INMESS DB \

TIPSMESS DB \ STR1 DB 20,?,20 DUP('$') X DB ? DATA ENDS

CODE SEGMENT

ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX L1: LEA DX,INMESS MOV AH,09H INT 21H;提示输入字符串

LEA DX,STR1 MOV AH,0AH

INT 21H ;输入字符串

MOV DL,10

MOV AH,02H INT 21H MOV DL,13 MOV AH,02H

INT 21H ;换行回车

CMP STR1+1,8

JA L1;比较输入的字符串长度是否大于8 L2: LEA DX,TIPSMESS MOV AH,09H INT 21H ;提示输入位置 MOV AH,01H INT 21H ;输入位置 SUB AL,30H MOV CL,AL

MOV DL,10 MOV AH,02H INT 21H MOV DL,13 MOV AH,02H

INT 21H ;换行回车

mov bl,str1+1 DEC bl CMP CL,bl

JA L2;判断指定位置是否超出 MOV BL,CL MOV BH,0 MOV AL,STR1[BX+2]

MOV DL,AL MOV AH,02H INT 21H

mov dl,10 mov ah,02h int 21h

mov ah,01h int 21h

XOR CX,CX MOV CL,str1[1] MOV BX,-1 MOV DL,0

l3: inc bx cmp al,str1[bx+2] jnz l4 inc dl l4:

LOOP l3

ADD DL,30H MOV CL,DL

MOV DL,0AH ;回车换行 MOV AH,2 INT 21H

MOV DL,0DH MOV AH,2 INT 21H

MOV DL,CL MOV AH,2 INT 21H

MOV AX,4C00H INT 21H CODE ENDS END START

实验四:

1、已知无符号字数组LIST 的第一个字数据为其元素个数,其后数据按由小到大的顺序保

存。试将某无符号字数据X 插入数组LIST 的正确位置,并修改元素个数。 编程提示:

该程序中要将X 插入递增数组,需要和数组中每一个数据值进行大小比较,找到合适位置保存X。

数据比较的方式:

(1)从前向后比较:找到小于X 的数据后,移动该数据及其后面的所有元素,将X 存放到腾出的单元中;

(2)从后向前比较:找到大于X 的数据后,直接将该数据向后移动一个数据的位置, 直到找到小于X 的数据,将X 保存到当前空出位置上

程序如下: DATA SEGMENT

LIST DW 5,12,13,15,16,17 ORG 20H

A1 DW 14 DATA ENDS CODE SEGMENT

ASSUME CS:CODE, DS:DATA START:MOV AX,DATA MOV DS,AX

MOV AX,A1 MOV CX,LIST MOV BX,CX ADD BX,BX

BEGIN: MOV DX,LIST[BX] CMP AX,DX JA LP

MOV LIST[BX+2],DX LP1: sub BX,2 LOOP BEGIN

LP: MOV LIST[BX+2],AX ADD LIST,1

MOV AX,4C00H INT 21H CODE ENDS END START

2、试用子程序实现以下要求。

题目:从键盘接收若干个一位十进制数值(0~9),并以十进制数据形式显示其和。 要求:(1)用子程序实现一位十进制数值的输入; (2)当用户未输入数值,直接回车时,结束输入;

(3)输出的数据为多位十进制数据,而机器内部计算的和是十六进制形式,需要进行 数制转换,然后以字符串的形式输出结果; (4)程序中要求有必要的提示信息。 例如:用户在提示信息下输入三个数值: Please input a number:5 Please input a number:3 Please input a number:4 程序显示运算结果 The sum is:12

3、试用子程序改进以上题目。

题目:从键盘接收若干个N位的十进制数值(0~65535),并以二进制、十进制、十六进制三种数制形式显示其和(假定多个数据和不超过65535)。

要求:(1)用子程序实现一个N位十进制数值的输入,在主程序的循环结构中调用该子程序;

(2)当用户未输入数值,直接回车时,结束输入;

(3)输出的数据为多位十进制数据,而机器内部计算的和是十六进制形式,需要进行数制转换,然后以十进制字符串的形式输出结果; (4)程序中要求有必要的提示信息。 例如:用户在提示信息下输入三个数值: Please input a number:15 Please input a number:30 Please input a number:45 程序显示运算结果

The sum is:0101 1010B 90D 5AH

程序如下:

DATA SEGMENT

X DW 0

NUM DB 6, ? ,6 DUP('$')

STR1 DB \STR2 DB \

sumB DB 20,0,20 DUP('$') sunD DB 20,0,20 DUP('$') sumH DB 20,0,20 DUP('$') DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START: MOV AX , DATA MOV DS , AX CALL INPUTNUM LEA DX,STR2 ;输出结果 MOV AH,09H INT 21H CALL getTwo ;二进制表示 CALL getTen ;十进制 CALL getSixtin ;十六进制表示 MOV AX , 4C00H INT 21H

;功能,多个多位十进制数的输入,并且实现了这几个数的数值相加 ;实际上这个是两个循环嵌套, ;入口参数:NUM

;出口参数:X (X是多个数据相加之后的和,字数据,之后可以除以2、10、16,依次转化相应进制)

INPUTNUM PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI AGAIN: LEA DX,STR1;提示输入信息 MOV AH,09H INT 21H LEA DX,NUM MOV AH,0AH INT 21H CALL CHANGE CMP NUM[2],0DH JZ exit ;初始化操作,以下内嵌套的循环是要将接受的多位十进制数转化为与之相对应的值 mov si,0 ;串指针初始化 mov bx,10 ;基数10,乘数 mov ax,0 ;累加结果初值 mov cl,num+1 mov ch,0 ;cx是循环的次数 jcxz LP1 ;若串长度为0,直接跳过此内循环 LP: mul bx mov dl,num[si+2] sub dl,30h mov dh,0

add ax,dx inc si loop LP LP1: add x,ax JMP AGAIN ;外循环,接收多个数据 exit:POP SI POP DX POP CX POP BX POP AX RET

INPUTNUM ENDP ;名字:CHANGE ;功能:回车换行 CHANGE PROC PUSH DX PUSH AX

MOV DL,0AH MOV AH,2 INT 21H

MOV DL,0DH MOV AH,2 INT 21H POP DX POP AX RET

CHANGE ENDP

;功能:将二进制数输出 ;入口参数:X ;出口参数: getTwo PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,2 MOV BX,2 MOV AX,X MOV sumB[1],0 LP: MOV DX,0 DIV CX MOV sumB[BX],DL INC BX INC sumB[1];记录长度 CMP AX,0 JA LP ;倒序输出 XOR CX,CX MOV CL,sumB[1] MOV BX,CX AGAIN:

MOV DL,sumB[BX+1] ADD DL,30H MOV AH,02H INT 21H

;回车换行 ;商在AX,余数在DX中 DEC BX LOOP AGAIN MOV DL,'B' MOV AH,02 INT 21H MOV DL,' ' MOV AH,02 INT 21H POP DX POP CX POP BX POP AX RET getTwo ENDP

;功能:将十进制数输出 ;入口参数:X ;出口参数: getTen PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,10 MOV BX,2 MOV AX,X MOV sunD[1],0 LP: MOV DX,0 DIV CX MOV sunD[BX],DL INC BX INC sunD[1];记录长度 CMP AX,0 JA LP ;倒序输出 XOR CX,CX MOV CL,sunD[1] MOV BX,CX AGAIN: MOV DL,sunD[BX+1] ADD DL,30H MOV AH,02H INT 21H DEC BX LOOP AGAIN MOV DL,'D' MOV AH,02 INT 21H MOV DL,' ' MOV AH,02 INT 21H POP DX

;商在AX,余数在DX中

POP CX POP BX POP AX RET getTen ENDP

;功能:将十六进制数输出 ;入口参数:X ;出口参数: getSixtin PROC PUSH AX PUSH BX PUSH CX PUSH DX MOV CX,16 MOV BX,2 MOV AX,X MOV sumH[1],0 LP: MOV DX,0 DIV CX MOV sumH[BX],DL INC BX INC sumH[1];记录长度 CMP AX,0 JA LP ;倒序输出 XOR CX,CX MOV CL,sumH[1] MOV BX,CX AGAIN: MOV DL,sumH[BX+1] CMP DL,9 JA NEXT ADD DL,30H MOV AH,02H INT 21H JMP theEnd NEXT: ADD DL,37H MOV AH,02H INT 21H theEnd: DEC BX LOOP AGAIN MOV DL,'H' MOV AH,02 INT 21H POP DX POP CX POP BX POP AX RET getSixtin ENDP CODE ENDS

;商在AX,余数在DX中 END START

本文来源:https://www.bwwdw.com/article/61i5.html

Top