汇编实验之数、数组、线性表

文章涉及多个编程问题,包括数组的分割、正负数计数、偶数查找、数组元素替换、删除特定值和计算平均值等,展示了基础的编程技巧和逻辑处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、题目描述:
  编写程序,将一个包含有20个数据的数组M分成2个数组:正数数组P和负数数组N,并分别把这两个数组中数据的个数显示出来。

DATAS SEGMENT
    M DB 4 DUP(8,-2,2,-3,-5)
    P DW 0
    N DW 0
    S1 DB "The number of positive numbers:",'$'
    S2 DB 13,10,"The number of negative numbers:",'$'
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    LEA SI,M
    MOV CX,20

L:  MOV AL,[SI]
    CMP AL,0;每个数跟0比较
    JL L1   ;负数jmp到L1
    JG L2   ;正数jmp到L2
    
L1: 
    INC N
    JMP L3
    
L2: 
    INC P
    JMP L3
    
L3: INC SI
    LOOP L
      
    LEA DX,S1
    MOV AH,9
    INT 21H
    LEA DI,P
    MOV AX,[DI];输出正数的个数
    MOV BL,10d
    DIV BL
    MOV DL,AL
    MOV BH,AH
    ADD DL,30H
    MOV AH,2
    INT 21H
    MOV DL,BH
    ADD DL,30H
    MOV AH,2
    INT 21H
      
    LEA DX,S2
    MOV AH,9
    INT 21H
    LEA DI,N
    MOV AX,[DI];输出负数的个数
    MOV BL,10d
    DIV BL
    MOV DL,AL
    MOV BH,AH
    ADD DL,30H
    MOV AH,2
    INT 21H
    MOV DL,BH
    ADD DL,30H
    MOV AH,2
    INT 21H 
          
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

解题思路:
①定义一个数组装进20个数。②定义两个数组装载正负数的个数,每个数组只装一个数而且占两字节,即这数最多为双位数。则个位数在AL中,十位数在AH中。

2、题目描述:
  试编写一段程序,求出首地址为DATA的100D字数组中的最小偶数,并把它存放在AX中。

DATAS SEGMENT
    DATA DW 10 DUP(5,6,-4,-5,8,9,10,188,-178,-255)
    COUNT DW ($-DATA)/2;数据长度,注意此处算长度,因为用字来定义数组,字占两字节
    COUNT1 DW 0   
DATAS ENDS

STACKS SEGMENT    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX    

    MOV CX,COUNT
    LEA SI,DATA-2

L1: ADD SI,2    ;寻找第一个偶数放在AX
    MOV AX,[SI]
    DEC CX
    TEST AL,01H ;若最后一位为0说明是偶数
    JNZ L1
    
L2: ADD SI,2    ;寻找第二个偶数放在BX
    MOV BX,[SI]
    CMP CX,0    ;如果到达数组的末尾则退出
    JZ L4
    DEC CX
    TEST BL,01H
    JNZ L2
    
    CMP AX,BX
    JG L3
    JMP L2
    
L3: MOV AX,BX    ;AX>BX,两者交换寄存器内容
    JMP L2    
L4: MOV AH,4CH   ;程序退出
    INT 21H
CODES ENDS
    END START

解题思路:
①采用两个寄存器装数据,将最小的偶数放在AX寄存器。②先将初始的偶数当成是最小的偶数,后面遇到的偶数放在BX寄存器中,若AX<BX,继续取下一个偶数;若AX>BX,则将BX寄存器的内容放入AX中,继续取下一个偶数,直至所有偶数都取完。

3、题目描述:
  有一个首地址为mem的100个字的数组,试编制程序删除数组中所有为零的项,并将后续项向前压缩,最后将数组的剩余部分补上零。

在这里插入代码片

4、题目描述:
  在首地址为DATA的字数组中,存放了100H个16位补码数,试编写一个程序,求出它们的平均值放在AX寄存器中;并求出数组中有多少个数小于此平均值,将结果放在BX寄存器中。

DATAS SEGMENT
    DATA  DW 100 DUP(-1,2,3,4,5,6,7,8,-9,-10)
    COUNT DW ($-DATA)/2;数据个数
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX

    MOV DX,0
    MOV DI,0
    MOV BX,0
    MOV CX,COUNT
    LEA SI,DATA
    
L:  MOV AX,[SI];计算数组里数的总和
    CWD;符号扩展,16位的字加法运算,需扩展成32位双字,即AX->DX:AX
    ADD BX,AX;低位相加
    ADC DI,DX;高位含进位加法
    ADD SI,2
    LOOP L
    
    MOV AX,BX;求得平均值放在AX
    MOV DX,DI    
    MOV BX,COUNT
    IDIV BX      ;补码数是带符号数,余数在DX中,商在AX中
    
    LEA SI,DATA
    MOV CX,COUNT
    MOV BX,0
    
L1: MOV DX,[SI];判断有多少个小于平均值的数,把个数放在BX
    CMP AX,DX
    JLE L3
    JG L2
    
L2: INC BX

L3: 
    ADD SI,2
    LOOP L1
    
FINAL:    
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

解题思想:求累加,字数据要扩展成双字。求得的平均数要依次与数组里的原来的数据作比较,求出个数,先把数组首地址放在某一寄存器中,然后取出即可,取下一数据则地址加一。

5、题目描述:
  已知数组A包含15个互不相等的整数,数组B包含20个互不相等的整数。试编制一个程序,把既在A中又在B中出现的整数存放于数组C1中。

DATAS SEGMENT
      BUFA      db 1,3,5,7,9,21,21,21,21,21,21,21,21,21,21;??不是字数组吗,为什么不用dw
      count1 dw $-BUFA;数据个数
      BUFB      db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
      count2 dw $-BUFB;数据个数
      BUFC      db 15 dup(?)
DATAS ENDS

STACKS SEGMENT
    
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX

    lea di,BUFC
    mov cx,count1
    mov bx,0
 L:                 
    push cx         
    mov al,BUFA[bx]
    inc bx
    mov cx,count2
    lea si,BUFB
 L2:                
    mov dl,[si]
    inc si
    cmp al,dl
    jz  L3    ;相等则将数据放入BUFC中,将BUFA的数依次与BUFB的数比对,BUFA的每一个数都与BUFB的所有数比对完,再对BUFA的下一个数进行上述操作
    loop L2
    jmp L4
 L3:                 
    mov [di],dl
    inc di
 L4:
    pop cx;后原CX-1,根据后面的loop
    loop L
    
    MOV AH,4CH
    INT 21H
CODES ENDS 
    END START

解题思路:

6、题目描述:
  以下面形式定义一个长整数,其所占用字节数由N得到,比如128位的数5746352413DE89674523BC9A78563412H定义成:
NUM DB 12H,34H,56H,78H,9AH,0BCH,23H,45H
DB 67H,89H,0DEH,13H,24H,35H,46H,57H
N DB $-NUM
试编写一个程序,实现对N字节的NUM的值求补,并把求补后的值仍保存在NUM中。

在这里插入代码片

7、题目描述:
   LINK指向一个字线性表,其中的首单元保存线性表的长度,编一个程序,将该线性表中的0FFFFH项删除。

DATAS SEGMENT
    link dw 7,0ffffh,2,3,4,5,6,8;首单元保存线性表长度
    buffer dw 7 dup(0);
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX

    MOV BX,0
    LEA SI,LINK
    MOV CX,[SI]          ;线性表长度存入CX
    LEA DI,BUFFER+2;
L:  ADD SI,2
	MOV AX,[SI]
	CMP AX,0FFFFH
	JNZ CUN
	LOOP L
	JMP FUZHI
CUN:MOV [DI],AX
	ADD DI,2
	INC BX            ;记录不等于要删除项0ffffh的项的个数
	LOOP L
FUZHI:
	LEA SI,BUFFER
	MOV [SI],BX
	LEA DI,LINK
	MOV CX,BX
L2: ADD SI,2
	ADD DI,2
	MOV AX,[SI]
	MOV [DI],AX
	LOOP L2

    MOV AH,4CH
	INT 21H
CODES ENDS
END START

解题思路:将原线性表中不需要删除的项的内容装在一个寄存器中,然后把寄存器内容依次复制回原来的线性表中。

8、题目描述:
  试编写一段程序,要求在长度为100H字节的数组中,找出大于42H的无符号数的个数并存入字单元UP中;找出小于42H的无符号数的个数并存入字单元DOWN中。

DATAS SEGMENT
	ARRAY DB 64 DUP(25H,43H,41H,78h)
	UP DW 0
	DOWN DW 0
	
DATAS ENDS
	
STACKS SEGMENT
STACKS ENDS

CODES SEGMENT
	ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    LEA SI,ARRAY
    MOV CX,100H
C0:
    MOV AL,[SI]
    CMP AL,42H
    JB C1
    JNB C2
C1:
    INC DOWN
    JMP C3
C2:
    INC UP
    JMP C3
C3:
     INC SI
     LOOP C0
         
     MOV AH,4CH
     INT 21H
     
CODES ENDS
    END START

解题思路:注意100H字节长度=256字节,在定义数组时切勿弄错。

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、付费专栏及课程。

余额充值