问题–在8086微处理器中编写汇编语言程序,以5字节的字符串搜索数字,将偏移量存储在找到元素的位置以及用于查找该数字的迭代次数。
例子 –
算法 –
- 在AX中移动2000并将其分配给ES
- 将值600分配给DI
- 在AL中移动25
- 在CX中移动0005
- 将CX的内容移至BX
- 清除方向标记(DF)的值
- 重复步骤7,直到未设置零标志(ZF)
- 从[DI]扫描字节,并检查其与AL内容的差异。更新DI的值
- 将DI的值减1
- 用CX减去BX的值
- 将BX的值减1
- 暂停程序
程序 –
OFFSET | MNEMONICS | COMMENT | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
400 | MOV AX, 2000 | AX <- 2000 | ||||||||||||||||||||||||||||||
403 | MOV ES, AX | ES <- AX | ||||||||||||||||||||||||||||||
405 | MOV DI, 600 | DI <- 600 | 408 | MOV AL, 25 | AL = 25 | 40A | MOV CX, 0005 | CX = 0005 | 40D | MOV BX, CX | BX <- CX | 40F | CLD | DF = 0 so that memory is accessed from lower byte to higher byte |
410 | REPNE SCAS B | Repeat till ZF = 0. Scan value from [DI] and compare with AL, Increment DI |
414 | DEC DI | DI = DI – 1 | 415 | MOV DX, DI | DX = DI | 417 | SUB BX, CX | BX = BX – CX | 419 | DEC BX | BX = BX – 1 | 41B | HLT | Stop |
解释 –
- MOV AX,2000用于将数据移动到寄存器AX。
- MOV ES,AX用于将AX的数据移动到段寄存器ES。
- MOV DI,600用于将偏移量600移动到目标索引(DI)。
- MOV AX,25用于将数据移动到AL。
- MOV CX,0005用于将数据移动到CX。
- MOV BX,CX用于将CX的内容复制到BX。
- CLD用于清除方向标志(DF)的值,以便从低字节到高字节访问存储器。
- REPNE SCAS B用于扫描DI的数据并将其与AL的数据进行比较,如果相等,则转到下一步,否则将DI的值加1并重复此步骤。
- DEC DI用于将DI的内容减1。
- MOV DX,DI用于将DI的内容移动到DX。
- SUB BX,CX用于通过CX减去BX的内容。
- DEC BX用于将BX的内容减1。
- HLT停止执行程序,并停止任何进一步的执行。