1. 程式人生 > >彙編 --實現一個迴圈程式 loop和cx

彙編 --實現一個迴圈程式 loop和cx

assume cs:code,ds:data,ss:stack

data segment             db'welcome to masm!';定義要顯示的字串(共16位元組)             db 02H,24H,71H;定義字元的屬性 data ends

stack segment             dw 8 dup(0) stack ends

code segment

    start:             mov ax,data             mov ds,ax             mov ax,stack             mov ss,ax             mov sp,10H

            xor bx,bx;bx清零,用來索引顏色             mov ax,0b872H;算出螢幕第12行中間的視訊記憶體的段起始位置放入ax中

            mov cx,3;s3迴圈控制行數,要顯示三個字串外迴圈為3次         s3: push cx;三個進棧操作為外迴圈s3儲存相關暫存器的值             push ax;以防止它們的值在內迴圈中被破壞             push bx

            mov es,ax;此時es為螢幕第12行中間的視訊記憶體的段起始位置

            mov si,0;si用來索引程式碼列的字元             mov di,0;di用來定位目標列

            mov cx,10H             ;s1迴圈控制存放的字元,一個字串中含有10H個位元組內迴圈為10H次         s1: mov al,ds:[si]             mov es:[di],al             inc si             add id,2             loop s1;吃迴圈實現偶地址中存放字元

            mov di,1;設定di的值為1,為在視訊記憶體奇數地址中存放字元的顏色屬性做準備             pop bx             mov al.ds:[bx+10H];取消顏色屬性             inc bx

            mov cx,10H;第二個內迴圈也為10H         s2: mov es:[di],al             add di 2             loop s2;此迴圈實現奇數地址存放字元的顏色屬性

            ;以下4句為下一趟外迴圈做準備             pop ax             add ax,0AH;將視訊記憶體的段地址起始地址設定為當前行的下一行                       ;[在段地址中甲0aH,相當於在偏移地址中加了0a0h(=160d)]             pop cx             loop s3

            mov ax,4C00H             int 21H

code ends end start