雙重循環打印ASCII的10H到FFH

該程序涉及到雙重循環,這裏考察到循環時對CX寄存器的壓棧以及出棧,首先寫出外部循環,並對CX寄存器賦值之後,寫出相應的操作,當寫內部循環的時候,也是需要爲CX寄存器賦值,如果不進行保護,則會覆蓋外部循環的CX寄存器的值,這裏就需要保護外部循環的相關數據(這裏相關數據的意思就是外部循環中用到的寄存器的內容,在內部循環之中也有用到),所以要通過PUSH壓進棧保護起來,例如,PUSH CX ,則可以對CX寄存器重新賦值,書寫到內部循環之中,當內部循環結束之後,POP CX,將保護的CX寄存器的值彈出棧,這裏的CX寄存器中的值,就是之前保護起來之前的值,運用PUSH,POP指令值書寫多重循環的關鍵

DATAS SEGMENT
    ;此處輸入數據段代碼  
DATAS ENDS

STACKS SEGMENT
    ;此處輸入堆棧段代碼
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   	
	MOV DX,0000H ;將DX,CX初始化
	MOV CX,0000H
	MOV DL,10H ;打印從10H到FFH的ASCII碼(保存第一個要打印的ASCII碼)
	
	MOV CX,000FH ;外層循環(行數)
LOOP_WAI:
	PUSH CX ;保存外循環的次數
	MOV CX,0010H ;內層循環次數,就是列數
	MOV AH,02H

LOOP_NEI:
	INT 21H ;打印ascll
	PUSH DX ;這裏爲了美觀打印空格,要爲DL賦值,則需要將DX內容保護起來
	MOV DL,00H
	INT 21H ;輸出空格
	
	POP DX
	INC DX ;使DX的內容自加1
	LOOP LOOP_NEI
	;此時這裏已經進行完一次內循環
	
	POP CX ;彈出之前保存起來的外部循環的次數
	PUSH DX ;保存DX,因爲要打印出換行
	MOV DL,0DH
	INT 21H
	MOV DL,0AH
	INT 21H
	
	POP DX ;打印完畢之後彈出保護起來得DX
	LOOP LOOP_WAI
   	
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


上述源代碼中註釋已經清楚了,希望對你有所幫助
這就是運行結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章