LC-3程序执行次数疑问:LOOP与NEXT指令执行次数解析
LC-3程序指令执行次数分析
先贴出目标程序:
.ORIG x3000 LEA R1, DATA LOOP LDR R2, R1, #0 BRz DONE NEXT ADD R1, R1, #2 BRnzp LOOP DONE HALT DATA .STRINGZ "1234567" .END
关键前提说明
.STRINGZ "1234567"会在内存中存储8个字节:x31('1'), x32('2'), x33('3'), x34('4'), x35('5'), x36('6'), x37('7'), x00(终止符),从DATA地址开始连续排列。LDR R2, R1, #0是读取R1指向地址的16位字(LC-3中1字=2字节),ADD R1, R1, #2是让指针R1每次跳过1个字(移动2字节)。- LC-3中未初始化的内存区域默认填充
x00。
LOOP与NEXT指令执行次数拆解
第1次LOOP:
- R1指向
DATA起始地址,读取字x3231(由x31和x32组成),非0,不触发BRz。 - 执行第1次NEXT:R1 +=2,指向第三个字节的地址。
- 跳回LOOP。
- R1指向
第2次LOOP:
- 读取字
x3433(由x33和x34组成),非0。 - 执行第2次NEXT:R1 +=2,指向第五个字节的地址。
- 跳回LOOP。
- 读取字
第3次LOOP:
- 读取字
x3635(由x35和x36组成),非0。 - 执行第3次NEXT:R1 +=2,指向第七个字节的地址。
- 跳回LOOP。
- 读取字
第4次LOOP:
- 读取字
x0037(由x37和终止符x00组成),整个字非0(仅低8位为0,16位字值不为0)。 - 执行第4次NEXT:R1 +=2,指向终止符后的第一个未初始化地址。
- 跳回LOOP。
- 读取字
第5次LOOP:
- 读取该地址的字(未初始化区域,值为
x0000),触发BRz DONE,直接跳转到结束逻辑,不执行NEXT。
- 读取该地址的字(未初始化区域,值为
对“7次迭代”误解的解释
你误以为循环是按单个字符迭代,但程序中每次操作的是16位字(2字节),指针每次移动2字节,并非逐个字符遍历。7个字符加1个终止符共8字节(4个字),加上后续1个全0的未初始化字,总共触发5次LOOP执行,其中前4次LOOP后会执行NEXT,第5次直接退出。
内容的提问来源于stack exchange,提问作者CLAUDIA OTERO
相关产品推荐
相关产品推荐

