循环的优化

    xiaoxiao2021-03-25  117

    问题描述

    已知在m * n的矩阵A的元素Aij 按照行优先排序存放在BUFA为首址的字节存储区域, 试编写程序,求每行元素之和Si

    问题解答

    .386 stack segment use16 stack db 100 dup(0) stack ends data segment use16 bufA db 11h, 12h, 13h, 14h, 15h db 21h, 22h, 23h, 24h, 25h db 31h, 32h, 33h, 34h, 35h db 41h, 42h, 43h, 44h, 45h M = 4 N = 5 buf dw M dup(0) data ends code segment use16 assume cs:code, ds:data, ss:stack main: mov ax, data mov ds, ax ;外循环 mov bx, M mov di, 0 mov si, 0 lopI: ;内循环 mov cx, N lopJ: mov al, bufA[si] inc si movsx ax, al add dx, ax loop lopJ mov buf[di], dx add di, 2 dec bx; jnz lopI ;循环M次 mov ah, 4ch int 21h code ends end main ;bx作为外循环控制变量 ;cx作为内循环控制变量 ;si作为取数指针, 每次加1 ;di作为送数指针, 每次加2 ;al存放临时取出的数, 有符号扩展到ax中 ;dx中存储每行的和

    总结

    使用行优先遍历行优先的二维矩阵的时候,直接使用变址寻址即可,可以省寄存器, 并且控制也更简单在循环次数已知的情况下,尽可能使用倒计数控制循环; 多层循环过程中, 内存循环的控制使用cx寄存器, 使用loop指令控制循环,可以提高执行效率。可以使用取数或者送数寄存器,作为循环控制, 如上面的代码可以更改为如下的方式 .386 stack segment use16 stack db 100 dup(0) stack ends data segment use16 bufA db 11h, 12h, 13h, 14h, 15h db 21h, 22h, 23h, 24h, 25h db 31h, 32h, 33h, 34h, 35h db 41h, 42h, 43h, 44h, 45h M = 4 N = 5 buf dw M dup(0) data ends code segment use16 assume cs:code, ds:data, ss:stack main: mov ax, data mov ds, ax mov cx, M mov di, 0 lopA: mov si, 0 lopB: mov al, bufA[si][bx] inc si movsx ax, al add dx, ax cmp si, N jb lopB mov buf[di], dx add di, 2 add bx, N loop lopA exit: mov ah, 4ch int 21h code ends end main
    转载请注明原文地址: https://ju.6miu.com/read-8029.html

    最新回复(0)