实训汇编语言设计——删除数组中所有为零的项

该程序采用汇编语言实现,主要功能是对一个包含20个元素的数组进行处理,删除数组中的所有零值元素,并将剩余元素向前压缩。最后,程序会在数组的末尾补充零值以确保数组长度不变。

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

;程序实现的功能如下:
;100字数组的地址为mem,编写的程序删除数组中所有为零的项,
;并将后续向前压缩,最后将数组的剩余部分补零。
data segment
 mem dw  20 dup(0,1, 2, 3, 4)
    n equ $-data
data ends
stack segment
 stapn dw 50 dup(?)
stack ends
 code segment
 main proc far
 assume ds:data,cs:code,ss:stack
start: 
 ;set up stack to retuan
    push ds
    sub ax,ax
    push ax
    ;set DS register to current segment
    mov ax,data
    mov ds,ax
    mov es,ax
    mov ax,stack
    mov ss,ax
    ;maim part of the code goes here
     mov cx,100
      lea di,mem  
      mov sp,di
      add sp,n     ;获取数组的最后字单元的地址加2
      push cx
      push di     
      add di,n
 again:mov dx,0    ;此部分循环完成数组men后的100个字的内容
       mov [di],dx ;全部补零,以便在后续的程序只须删除零项
       add di,2    ;而不必在数组最后部分补零
       loop again
      pop di
      pop cx       ;记录外循环次数
loop1:test [di],0ffffh
      jnz  continue
      mov si,di     ;记录0项的ea
 next:mov ax,[si+2] ;实现向前压缩
      mov [si],ax
      add si,2
      cmp si,sp
      jae continue
      jmp next
continue:add di,2
         loop loop1
   exit:ret  
 main endp
  ;--------------------------------------------------
 code ends
    ;************************************************
    end start             
       
      
            

转载于:https://www.cnblogs.com/javabluesky/archive/2007/12/21/2211922.html

汇编语言程序设计中,数组操作是一个常见的任务。下面是一个简单的汇编语言程序示例,展示了如何在数组中查找元素删除该元素。假设我们使用的是x86架构的汇编语言。 ```assembly section .data array db 10, 20, 30, 40, 50 ; 定义一个数组 array_len equ $ - array ; 计算数组的长度 target db 30 ; 要查找的目标元素 new_line db 0xA ; 换行符 section .bss result resb 1 ; 存储查找结果 section .text global _start _start: ; 初始化寄存器 mov ecx, array_len ; 设置循环计数器为数组长度 mov esi, array ; 将ESI指向数组的起始地址 mov al, target ; 将目标元素加载到AL寄存器 find_loop: cmp ecx, 0 ; 检查是否到达数组末尾 je not_found ; 如果到达数组末尾,跳转到未找到标签 cmp [esi], al ; 比较当前元素与目标元素 je found ; 如果找到目标元素,跳转到找到标签 inc esi ; 移动到下一个元素 dec ecx ; 减少计数器 jmp find_loop ; 继续循环 found: ; 删除元素 mov edi, esi ; 将EDI指向找到的元素 inc edi ; 移动到下一个元素 mov edx, array_len ; 设置EDX为数组长度 sub edx, ecx ; 计算要移动的元素数量 mov ecx, edx ; 将ECX设置为要移动的元素数量 rep movsb ; 移动元素以覆盖找到的元素 dec array_len ; 减少数组长度 ; 输出结果 mov eax, 4 mov ebx, 1 mov ecx, new_line mov edx, 1 int 0x80 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 not_found: ; 输出未找到的信息 mov eax, 4 mov ebx, 1 mov ecx, new_line mov edx, 1 int 0x80 ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ``` 这个程序的主要步骤如下: 1. 定义数据段,包含数组、目标元素和换行符。 2. 初始化寄存器,设置循环计数器为数组长度,将ESI指向数组的起始地址。 3. 进入查找循环,比较当前元素与目标元素。 4. 如果找到目标元素,删除该元素输出结果。 5. 如果未找到,输出未找到的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值