콘솔화면에서
X 좌표값의 MAX치를 넘으면 커서는 다음행으로 이동한다
INCLUDE Irvine32.inc .data color BYTE 255 ;전경색 X BYTE 0 ;X좌표값 .code main PROC mov ecx,256 ;256가지 경우의 수만큼 반복 L1: mov al,color ;전경색 대입 call SetTextColor ;전경색 세팅 dec color ;전경색값 변화 mov dl,X ;X좌표값 대입 call GotoXY ;커서 이동 ;콘솔화면의 X좌표값을 벗어나면 다음 행으로 자동이동 inc X ;X좌표값 증가 pushad ;스택에 레지스터 저장 mov al,'A' ;AL 레지스터에 'A'문자 대입 call WriteChar ;화면에 'A'문자 출력 popad ;스택에서 레지스터값 팝 loop L1 ret main ENDP END main
간결한 코드는 삽질에서 비롯된다.
밑은 삽질의 흔적
커서의 행이동을 먼저 생각해서 복잡해진 사례
INCLUDE Irvine32.inc .data color BYTE 255 Y BYTE 0 X BYTE 0 str1 BYTE "공도리",0 .code main PROC mov ecx,10 ;L1 10번 반복 L1: mov dl,X ;X좌표값 대입 mov Y,0 ;Y좌표값 0 대입, 첫째줄로 이동 mov dh,Y ;Y좌표값 대입, 첫째줄로 이동 call GotoXY ;DX에 해당하는 좌표로 이동 pushad ;레지스터 푸시 - (1) mov ecx,24 ;L2 24번(Y좌표 행 row의 크기 만큼) 반복 L2: mov al,color ;eax에 전경색 대입 call SetTextColor ;전경색 세팅 mov edx,OFFSET str1 ;str1의 주소값 대입 call WriteString ;화면에 문자열 출력 mov dl,X ;X좌표값 세팅 mov dh,Y ;Y좌표 세팅 call GotoXY ;(X,Y)좌표로 이동 inc Y ;Y좌표값 증가 dec color ;전경색 값 변경 pushad ;레지스터 푸시 - (2) mov eax,25 ;딜레이 시간 25ms세팅 call Delay ;딜레이 주기 popad ;레지스터 팝 - (2) loop L2 ;L2루프 반복 popad ;레지스터 팝 - (1) add X,6 ;X좌표값 증가 loop L1 ;L1루프 반복 mov ecx,16 ;남은 반복수 16로 L3루프 반복 add X,6 ;다음 X좌표로 이동 mov dl,X ;X좌표 대입 mov Y,0 ;Y좌표값 0 대입, 첫째행으로 이동 L3: mov al,color ;eax에 전경색 대입 call SetTextColor ;전경색 세팅 mov edx,OFFSET str1 ;str1의 주소값 대입 call WriteString ;화면에 문자열 출력 call GotoXY ;커서 이동 inc Y ;Y좌표값 증가 mov dh,Y ;다음 행으로 이동 mov dl,X dec color ;전경색 값 변경 pushad ;레지스터 푸시 - (3) mov eax,25 ;딜레이 시간 25ms세팅 call Delay ;딜레이 주기 popad ;레지스터 팝 - (3) loop L3 ret main ENDP END main
'노트정리 > 어셈블리 책 스터디 공간' 카테고리의 다른 글
6.9.5. 6.9.6 대학등록(1)(2) (0) | 2010.07.12 |
---|---|
6.9.4 시험성적계산2 (어셈블리어) (0) | 2010.06.30 |
6.9.3 시험성적계산 (0) | 2010.06.30 |
6.9.2 루프 구현 (0) | 2010.06.30 |
무작위 화면 위치에 문자 출력 (0) | 2010.06.13 |
난수 정수 (0) | 2010.06.13 |
간단한 덧셈2 (0) | 2010.06.13 |
ch5 간단한 덧셈1 (0) | 2010.06.13 |