汇编中如何获取数组长度?及数组元素唯一性检测程序补全求助
汇编语言问题解答
一、如何在汇编语言中获取数组长度
获取数组长度主要有以下几种常用方式:
- 预定义常量计算:在定义数组后,用当前地址符号
$减去数组起始地址得到长度,这是最常用的方法。示例: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
代码逻辑说明
- 初始化:设置数据段寄存器,确保能正确访问数组。
- 外层循环:遍历数组中的每个元素作为基准(从第一个到倒数第二个)。
- 内层循环:将基准元素与它之后的所有元素逐一比较。
- 重复检测:一旦发现相等元素,立即将
DL置1并退出程序,避免不必要的计算。 - 无重复处理:若所有元素都比较完成未发现重复,将
DL置0。
内容的提问来源于stack exchange,提问作者BennyThenemy
相关产品推荐
相关产品推荐

