汇编语言-入门练习

本文提供了一系列汇编语言编程练习题,包括字符处理、数组比较、逆序输出等任务,旨在帮助初学者掌握汇编语言的基本操作。

练习题目:

1.    通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。
2.    编写一个程序,要求比较数组ARRAY中的三个16位补码,并根据比较结果在终端上显示如下信息:
1)    如果三个数都不相等,显示0;
2)    如果三个输油两个相等,显示1;
3)    如果三个数都相当,显示2。
3.    从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。(定义数据段保存录入字符)
4.    编写一个程序,要求通过键盘接收一个个位数N,然后显示N个字母‘$’。
5.    将BX寄存器中的数用16位二进制数形式显示出来。
6.    用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符。

题目分析:

1.第一题的关键在于保存输入的数值在寄存器中,并判断输入的值是否为小写字母,若为小写字母输出时才能保证按顺序输出,若不为小写字母,则结束

2.首先初始化ARRAY数组中,由于占用两个字节,所以又将数组赋值给AX,BX,CX进行操作,关键在于两两对比得出大小,将输出的0,1,2封装成模块调用,当得出结果就立即输出结果

3.将输入的十个字符倒叙输出,采用变址寻址的方式,用SI,DI寄存器保存相对偏移量,一个正序对数组赋值,一个逆序将数组输出

4.第四题是将输入的数字就输出多少‘$’,这就要求我们得到输入的数字,ASCII码就是将得到的AL的值减去30H,控制循环的次数,调用DOS功能,输出’$’。

5.先输入4个字符,将ASCII码转化成二进制码,其中需要判断是数字还是字母,数字减去30H,若为字母还需要再减去07H,将16进制数保存在BX寄存器,每次通过移位通过进位标志位判断是0还是1以此来输出

6.采用CL和CH分别来控制循环次数,内层循环为循环每一行的内容,其中需要输出空格,外层循环为输出下一行的内容,在一行输出完毕后需要输出回车换行,对此需要对DL重新赋值,需要保存之前的值。

设计方案:

1.

CODE SEGMENT
    ASSUME CS:CODE
START:
    MOV AH,07H
    INT 21H
    MOV BL,AL
    CMP BL,5AH;判断是否为小写字母
    JBE L2;若不是,跳转至结束
    CMP BL,7AH;判断是否为小写字母
    JA L2;若不是,跳转至结束

L1:    SUB AL,01H
    MOV DL,AL
    MOV AH,02H
    INT 21H
    ADD DL,01H
    INT 21H
    ADD DL,01H
    INT 21H
L2: MOV AH,4CH
    INT 21H
CODE ENDS
    END START

2.

DATA SEGMENT
    ;此处输入数据段代码  
    ARRAY DW 1100H,1100H,1100H
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
    ;此处输入代码段代码
    LEA BX,ARRAY
    MOV CX,[BX]
    CMP CX,[BX+2]
    JNE L3
    MOV CX,[BX+2]
    CMP CX,[BX+4]
    JNE L2
L1: MOV AH,02H
    MOV DL,'2'
    INT 21H
    JMP EXIT
L2: MOV AH,02H
    MOV DL,'1'
    INT 21H
    JMP EXIT
L3: MOV CX,[BX]
    CMP CX,[BX+4]
    JNE L4
    JMP L2
L4: MOV CX,[BX+2]
    CMP CX,[BX+4]
    JE L2
    MOV AH,02H
    MOV DL,'0'
    INT 21H
EXIT:MOV AH,4CH
    INT 21H
CODE ENDS
    END START

逻辑图:

3.

DATA SEGMENT
    ;此处输入数据段代码  
    ARRAY DB 10 DUP(?)
DATA ENDS


CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
START:
    MOV AX,DATA
    MOV DS,AX
    ;此处输入代码段代码
    LEA BX,ARRAY
    MOV CL,0AH
    MOV SI,9
    MOV DI,0
L2: MOV AH,01H
    INT 21H
    MOV [ARRAY][DI],AL
    INC DI
    DEC CL
    JNZ L2
    MOV AH,02H
    MOV DL,0DH
    INT 21H
    MOV DL,0AH
    INT 21H
    MOV CL,0AH
L1: MOV AH,02H
    MOV DL,[BX][SI]
    INT 21H
    DEC SI
    SUB CL,1
    JNZ L1
    MOV AH,4CH
    INT 21H
CODE ENDS
    END START

4.

CODE SEGMENT
    ASSUME CS:CODE
START:

    ;此处输入代码段代码
    MOV AH,01H
    INT 21H
    MOV CL,AL
    SUB CL,30H;01H ASCII to number
    MOV AH,02H
    MOV DL,0DH
    INT 21H
    MOV DL,0AH
    INT 21H
J1: MOV DL,'$'
    INT 21H
    DEC CL
    JNZ J1
    MOV AH,4CH
    INT 21H
CODE ENDS
    END START

逻辑图:

5.


CODES SEGMENT
    ASSUME CS:CODES
START:
    ;此处输入代码段代码
    MOV CH,4
    MOV CL,4
    MOV BX,0
J1: MOV AH,01H
    INT 21H
    SUB AL,30H
    CMP AL,0AH
    JL  J5
    SUB AL,07H
J5: SHL BX,CL
    OR BL,AL
    DEC CH
    JNZ J1
    MOV CX,16
J2: SHL BX,1
    JNC J3
    MOV DL,'1'
    MOV AH,02H
    INT 21H
    JMP J4
J3: MOV DL,'0'
    MOV AH,02H
    INT 21H
J4: DEC CX
    JNZ J2
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

逻辑图:

6.
CODES SEGMENT
    ASSUME CS:CODES
START:
    ;此处输入代码段代码
    MOV CH,15
    MOV BL,10H
J1: MOV CL,16
J2: MOV DL,BL
    MOV AH,02H
    INT 21H
    INC BL
    DEC CL
    JNZ J2
    MOV DL,0DH
    INT 21H
    MOV DL,0AH
    INT 21H
    DEC CH
    JNZ J1
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

逻辑图:

  • 测评及评估

1、输入一个字母,连续输出其前序字母和后续字母

输入非小写字母时:

2、输入三个数字,ARRAY DW 1100H,1200H,1300H都不相同,输出0

ARRAY DW 1100H,1100H,1300H有2个相同:

ARRAY DW 1100H,1100H,1100H

3、输入十个字符,逆序输出

4、输入数字5回显,显示出5个‘$’符号,

5、输入十六进制1468H,输出结果0001010001101000

6、输出显示ASCII码为10H-FFH的所有字符

 

欢迎大家指教学习

 

5.1试编写一个汇编语言程序,要求对键盘输入的小写字母用大写字母显示出来。 5.2 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序输出 5.3 将AX寄存器中的16位数分成4组,每组4位,然后把这四组数分别放在AL、BL、CL、DL中。 5.4 试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NOT MATCH’。 5.5 试编写一程序,要求能从键盘接收一个个位数N,然后响铃N次。 5.6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中的数据的个数显示出来。 5.7 试编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在AX中。 5.8 把AX中存放的16位二进制数K看作是8个二进制的“四分之一字节”。试编写一个程序,要求数一下值为3(即11B)的四分之一字节数,并将该数在终端上显示出来。 5.9 试编写一汇编语言程序,要求从键盘接收一个四位的十六进制数,并在终端上显示与它等值的二进制数。 5.10 设有一段英文,其字符变量名为ENG,并以$字符结束。试编写一程序,查对单词SUN在该文中的出现次数,并以格式”SUNXXXX“显示出次数。 5.11 从键盘输入一系以$为结束的字符串,然后对其中的非数字字符计数,并显示出计数结果。 5.12 有一个首地址为MEM的100D字数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。 5.13 在STRING到STRING+99单元中存放着一个字符串,试编制一程序测试该字符串中是否存在数字,如有,则把CL的第五位置1,否则置0. 5.14 在首地址为TABLE的数组中按递增次序存放着100H个16位补数,试编写一个程序把出现次数最多的数及其出现的次数分别放在AX和CX中。 5.15 数据段中已定义了一个有N个字数据的数组M,试编写一程序求出M中绝对值最大的数,把它放在数据段的M+2n单元中,并将该数的偏移地址存放在M+2(n+1)单元中。 5.16 在首地址为DATA的字数组中,存放了100H个16位补数,试编写一个程序求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。 5.17 试编写一个程序,把AX中的十六进制数转换为ASCII,并将对应的ASCII依次存放到MEM数组中的四个字节中,例如:当(AX)=2A49H时,程序执完后,MEM中的4个字节的内容为39H,34H,41H和32H。 5.18 把0~100D之间的30个数存入以GRADE为首地址的30个字数组中,GRADE+i表示学号i+1的学生的成绩。另一个数组RANK为30个学生的名次表,其中RANK+i的内容是学号为i+1的学生的名次。编写一程序,根据GRADE中的学生成绩,将学生名次填入RANK数组中。 5.19 已知数组A包含15个互不相等的整数,试编写一程序,把既在A中又在B中出现的整数存在于数组中C中。 5.20 设在A,B和C单元中存放着三个数,若三个数都不是0,则求出三树之和并存放于D单元中;其中有一个数为0,则把其他两个数也清零。试编写此程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值