如何仅使用直接寻址方式实现数组元素求和?
不用间接寻址指针实现数组求和(自修改代码方案)
问题背景
我们有一个包含100个数字的数组,之前接触过相关求和问题但未理解具体解法。现有一段用间接寻址实现求和的代码,但希望不使用arrptr指针完成数组元素求和,已知需要通过自修改代码实现,但不清楚具体写法,尝试过将元素移动到数组首地址的方法但未成功。
可用指令集
| 指令 | 含义 |
|---|---|
mov addr1,addr2 | Maddr1 = (Maddr2) |
mov addr1,(addr2) | Maddr1 = (M_(Maddr2)) |
mov (addr1),addr2 | M_(Maddr1) = (Maddr2) |
add addr1,addr2 | Maddr1 = (Maddr1) + (Maddr2) |
sub addr1,addr2 | Maddr1 = (Maddr1) - (Maddr2) |
add addr1,(addr2) | Maddr1 = (Maddr1) + (M_(Maddr2)) |
sub addr1,(addr2) | Maddr1 = (Maddr1) - (M_(Maddr2)) |
jnz addr1,addr2 | 若(Maddr1)≠0则PC = addr2 |
jz addr1,addr2 | 若(Maddr1)=0则PC = addr2 |
jneg addr1,addr2 | 若(Maddr1)<0则PC = addr2 |
jpos addr1,addr2 | 若(Maddr1)>0则PC = addr2 |
原间接寻址实现代码
org 100h loop: add sum,(arrptr) add arrptr,two sub count,two jnz count,loop arrptr: dw array sum: dw 0 count: dw 200 two: dw 2 array: dw 100 dup(?)
自修改代码实现方案
自修改代码的核心思路是在循环中动态修改求和指令的操作数地址,让每次循环都能访问数组的下一个元素。具体实现如下:
org 100h loop: add sum,array ; 初始访问array[0],后续会被修改为array+2、array+4... ; 修改add指令中的数组偏移量 mov temp,loop+2 ; 取add指令中操作数的地址(loop是指令起始,+2是操作数位置) add temp,two ; 偏移量+2,指向下一个数组元素 mov loop+2,temp ; 将新的偏移量写回add指令 sub count,two ; 剩余元素数减2(每个元素占2字节) jnz count,loop ; 未处理完则继续循环 sum: dw 0 count: dw 200 ; 100个元素×2字节=200 two: dw 2 temp: dw 0 array: dw 100 dup(?)
代码解释
- 初始求和指令:
add sum,array一开始访问数组的第一个元素(array[0])。 - 定位指令操作数:
loop+2是add sum,array指令中array操作数的存储地址(按16位指令结构假设,操作数部分从指令起始偏移+2的位置开始)。 - 更新偏移量:把该地址的值加2,让下一次循环的
add指令自动访问array+2(即数组的第二个元素)。 - 循环控制:通过
count变量记录剩余需要处理的字节数,每次减2,直到为0时退出循环。
这种方式不需要额外的指针变量,直接修改代码段中的指令内容,实现对数组元素的遍历求和。
内容的提问来源于stack exchange,提问作者Arthouse Tracker
相关产品推荐
相关产品推荐

