You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汇编中如何获取数组长度?及数组元素唯一性检测程序补全求助

汇编语言问题解答

一、如何在汇编语言中获取数组长度

获取数组长度主要有以下几种常用方式:

  • 预定义常量计算:在定义数组后,用当前地址符号$减去数组起始地址得到长度,这是最常用的方法。示例:
    arr db 'ABCDEVGTYO'
    arr_len equ $ - arr  ; $代表当前汇编地址,计算结果就是数组字节数
    
  • 特殊字符标记结尾:如果是字符串数组,可在末尾添加结束符(如0),通过遍历到结束符来统计长度。但这种方法需要执行运行时计算,效率略低。
  • 手动指定长度:若数组长度固定且已知,直接在代码中硬编码长度值。但这种方式灵活性差,数组修改后需同步更新长度值。

二、检测字符数组元素是否全部唯一的汇编实现

以下是完整的汇编程序,实现检测数据段起始地址0处的字符数组ABCDEVGTYO元素是否全部不同,结果存入DL寄存器(0表示无重复,1表示存在重复):

; 数据段,起始地址设为0
data segment at 0
    arr db 'ABCDEVGTYO'  ; 目标字符数组,起始地址0
    arr_len equ $ - arr   ; 自动计算数组长度
data ends

; 代码段
code segment
start:
    mov ax, data
    mov ds, ax           ; 初始化数据段寄存器
    
    mov cx, arr_len
    dec cx               ; 外层循环次数:n-1(无需比较最后一个元素)
    mov si, 0            ; si指向当前基准元素的索引
outer_loop:
    mov al, arr[si]      ; 取出当前基准元素
    mov di, si
    inc di               ; di指向基准元素的下一个元素,开始内层比较
    mov dx, cx           ; 保存外层循环的剩余次数(内层循环会修改cx)
    
inner_loop:
    cmp al, arr[di]      ; 比较基准元素与当前元素
    jne next_element     ; 不相等则继续下一个元素
    mov dl, 1            ; 发现重复元素,DL置1
    jmp exit_program     ; 直接退出程序,无需继续检测

next_element:
    inc di
    loop inner_loop      ; 内层循环:继续比较下一个元素
    
    mov cx, dx           ; 恢复外层循环的剩余次数
    inc si
    loop outer_loop      ; 外层循环:切换到下一个基准元素
    
    mov dl, 0            ; 所有元素检测完成,无重复,DL置0

exit_program:
    ; DOS环境下退出程序
    mov ah, 4ch
    int 21h
code ends
end start

代码逻辑说明

  1. 初始化:设置数据段寄存器,确保能正确访问数组。
  2. 外层循环:遍历数组中的每个元素作为基准(从第一个到倒数第二个)。
  3. 内层循环:将基准元素与它之后的所有元素逐一比较。
  4. 重复检测:一旦发现相等元素,立即将DL置1并退出程序,避免不必要的计算。
  5. 无重复处理:若所有元素都比较完成未发现重复,将DL置0。

内容的提问来源于stack exchange,提问作者BennyThenemy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:15:12