问题–编写汇编语言程序以查找给定系列中包含连续存储位置中存储的8位数字的奇数和,并将结果存储在另一个存储位置中。
例子 –
示例说明–
- 500偏移量存储系列的计数器值,并且该系列的元素从501到504偏移量开始。
- 在此示例中,我们只有4个术语。将奇数项(在BL寄存器中找到)加到AL寄存器中的15 + 07,结果存储在(1C)AL寄存器中。
- AL寄存器的结果存储在600偏移量中。
假设–
- 告诉该系列中有多少个数字的计数器值存储在存储位置500中。
- 系列的元素存储在从501开始的连续存储位置中。
- 结果存储在存储位置600中。
- 该程序的起始地址为400。
测试 –
Syntax: TEST d, s
它执行目标(d)和源(s)的AND操作,但结果仅存储修改后的标志而不会存储。
算法 –
- 从偏移500加载数据到寄存器CL。
- 增加偏移量的值。
- 将00H装入CH寄存器。
- 将00H装入AL寄存器。
- 将数据从偏移量加载到寄存器BL。
- 使用TEST指令检查BL中的数据是偶数还是奇数,如果设置了零标志,则表示数据为偶数,然后转到步骤7;否则,数据为奇数,然后转到步骤8。
- 跳转到内存位置413H。
- 将AL和BL寄存器的数据相加并将结果存储在AL寄存器中。
- 增加偏移量的值。
- 如果CX的内容不等于零,则跳转到内存位置40AH,否则转到步骤11。
- 将数据从AL寄存器加载到存储位置600。
1个 - 结尾
程序 –
Address | Mnemonics | Comments |
---|---|---|
400 | MOV SI, 500 | SI<-500 |
403 | MOV CL, [SI] | CL<-[SI] |
405 | INC SI | SI<-SI+1 |
406 | MOV CH, 00 | CH<-00 |
408 | MOV AL, 00 | AL<-00 |
40A | MOV BL, [SI] | BL<-[SI] |
40C | TEST BL, 01 | BL.01 |
40F | JZ 413 | Jump to 413 memory location if zero flag is set |
411 | ADD AL, BL | AL<-AL+BL |
413 | INC SI | SI<-SI+1 |
414 | LOOP 40A | jump to 40A memory location if content of CX is not equal to zero |
416 | MOV [600], AL | [600], AL |
41A | HLT | end |
解释 –
- MOV SI,500将值500加载到SI。
- MOV CL,[SI]将偏移量SI的数据加载到CL寄存器中。
- INC SI将SI的值增加一。
- MOV CH,00将值00加载到CH寄存器中。
- MOV AL,00将值00加载到AL寄存器中。
- MOV BL,[SI]将偏移量SI的数据加载到BL寄存器中。
- 测试BL,01和BL的内容以及值01和标志寄存器的操作进行了修改。
- 如果设置了零标志,则JZ 413跳转到413存储位置。
- 添加AL,BL将AL和BL寄存器的内容相加,并将结果存储在AL寄存器中。
- INC SI将SI的值增加一。
- 如果CX的值不为零,则LOOP 40A跳至40A存储器位置。
- MOV [600],AL将AL寄存器的内容加载到存储位置600。
- HALT结束