Loop 사용법 =>

ex)

mov ecx, LoopCount ; loop를 수행할 횟수(loopcount), ecx 레지스터에 저장한다.
LoopName : ; ecx레지스터의 카운트 값이 0이 될때까지 1씩감소하면서 loop를 돈다.
    loop를 돌면서 반복
    수행할 제어문들
loop LoopName


/* fibo.asm */

; made by hahahia 

; site => http://hahahia.tistory.com

INCLUDE Irvine32.inc

.data

fibo DWORD 1, 1, 5 DUP(0)

.code

main PROC

mov esi, OFFSET fibo

mov eax, [esi]

call Dumpregs

add esi, 4

mov eax, [esi]

call Dumpregs

add esi, 4

mov ecx, 5

L1 :

mov ebx, [esi-4]

mov edx, [esi-8]

add ebx, edx

mov eax, ebx

mov [esi], eax

call Dumpregs

add esi, 4

loop L1

exit

main ENDP

END main

신고

'Language > Assembly' 카테고리의 다른 글

assem fibo  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제(loop추가)  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제  (0) 2012.05.04
SetTextColor procedure  (0) 2012.05.04
Reversing String(readstring, writestring procedure사용법)  (0) 2012.05.04
mov, add, sub 명령어  (0) 2012.04.14

 

참고=>http://hahahia.tistory.com/81

/* loop_sub.asm */

; made by hahahia
; site => http://hahahia.tistory.com

INCLUDE Irvine32.inc
.data
num1 DWORD ?
num2 DWORD ?

prompt1 BYTE "input num1 = ", 0
prompt2 BYTE "input num2 = ", 0
result BYTE "result = ", 0
.code
main PROC
 mov ecx, 4
 L1 :   ; loop를 통해 4번돌게끔한다.     
  mov dh, 10
  mov dl, 20                ; 나머지 소스코드의 주석은 링크 참고 
  call Gotoxy
  mov edx, OFFSET prompt1
  call WriteString
  call ReadInt
  mov num1, eax
  mov dh, 11
  mov dl, 20
  call Gotoxy
  mov edx, OFFSET prompt2
  call WriteString
  call ReadInt
  mov num2, eax
  mov eax, num1
  sub eax, num2
  call Clrscr
  mov dh, 13
  mov dl, 20
  call Gotoxy
  mov edx, OFFSET result
  call WriteString
  call WriteInt
 Loop L1
 exit
main ENDP

END main

신고

'Language > Assembly' 카테고리의 다른 글

assem fibo  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제(loop추가)  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제  (0) 2012.05.04
SetTextColor procedure  (0) 2012.05.04
Reversing String(readstring, writestring procedure사용법)  (0) 2012.05.04
mov, add, sub 명령어  (0) 2012.04.14

Gotoxy procedure 사용법 =>

dh 레지스터에 커서를 옮길 x좌표, dl 레지스터에 커서를 옮길 y좌표를 mov 시킨 이후
call Gotoxy 를 이용하면 dh, dl(x, y)에 따른 프롬프트의 좌표로 커서를 옮길 수 있다.


/* subtraction.asm */

커서를 프롬프트창의 중간으로 두고, 두수를 입력받아 두 수의 차를 출력합니다.

INCLUDE Irvine32.inc
.data
num1 DWORD ?
num2 DWORD ?
prompt1 BYTE "input num1 = ", 0    ; 입력 prompt1
prompt2 BYTE "input num2 = ", 0    ; 입력 prompt2
result BYTE "result = ", 0              ; 결과 prompt
.code
main PROC
 call Clrscr
 mov dh, 10
 mov dl, 20
 call Gotoxy           ; Gotoxy로 커서를 프롬프트창의 중간으로 둔다 x,y좌표(dh, dl)
 mov edx, OFFSET prompt1
 call WriteString  ; 숫자하나를 입력받는다
 call ReadInt
 mov num1, eax
 mov dh, 11
 mov dl, 20
 call Gotoxy  ; 바로 밑으로 커서를 둔다
 mov edx, OFFSET prompt2
 call WriteString ; 또다른 숫자하나를 입력받는다
 call ReadInt  
 mov num2, eax
 mov eax, num1
 sub eax, num2
 mov dh, 12
 mov dl, 20
 call Gotoxy
 mov edx, OFFSET result
 call WriteString  ; 계산후 출력
 call WriteInt
 exit
main ENDP

END main


실행결과 =>


신고

'Language > Assembly' 카테고리의 다른 글

assem fibo  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제(loop추가)  (0) 2012.05.04
Gotoxy를 통한 커서 컨트롤 예제  (0) 2012.05.04
SetTextColor procedure  (0) 2012.05.04
Reversing String(readstring, writestring procedure사용법)  (0) 2012.05.04
mov, add, sub 명령어  (0) 2012.04.14

SetTextColor Procedure


 black = 0

red = 4 

gray = 8 

lightRed = 12 

blue = 1 

 magenta = 5

lightBlue = 9 

lightMagenta = 13 

green = 2 

brown = 6 

lightGreen = 10 

yellow = 14 

cyan = 3 

lightGray = 7 

lightCyan = 11 

white = 15 

ex) yellow + (blue * 16) ; 파란색 배경에 흰색 문자열로 출력되도록 설정한다.
위 표에서 색상에 부여된 숫자나 색상이름 둘다 사용할 수 있다.

/* SetTextColor.asm */

INCLUDE Irvine32.inc

.data

buffer BYTE "Hello World!!", 0

newline BYTE 0Dh, 0Ah, 0

count DWORD 4

.code

    main PROC

mov ecx, 4

L1 :

mov eax, count

call SetTextColor ; count를 이용해 글씨 색깔을 다르게 처리 

mov edx, OFFSET buffer

call WriteString

mov edx, OFFSET newline ; 개행 처리

call WriteString

inc count

loop L1

exit

main ENDP

END main


실행결과 : 


신고


ReadString procedure 사용법 =>
edx 레지스터에 입력받을 string의 OFFSET을 mov시키고
ecx 레지스터에 string의 SIZEOF(TYPE*LENGTHOF)값을 대입한 이후
call ReadString 명령문을 실행시키면 커서창에서 string을 입력받을 수 있다.

WriteString procedure 사용법 =>
edx 레지스터에 출력할 string의 OFFSET을 mov 시키고
call WriteString 명령문을 실행시키면 해당하는 string을 출력 할 수 있다.

/* revstr.asm */

INCLUDE Irvine32.inc

.data

buffer BYTE 50 DUP(0)

byteCount DWORD ?

.code

    main PROC

           mov edx, OFFSET buffer

           mov ecx, SIZEOF buffer

           call ReadString ; string을 입력받는 과정

           mov byteCount, eax ; string의 길이를 받는 과정

           mov ecx, byteCount ; string의 길이만큼 루프를 돌기 위한 제어문

           mov esi, 0

 

           L1:

                     movzx eax, buffer[esi]

                     push eax ; 스택에 차례로 넣는다

                     inc esi

           loop L1

 

           mov ecx, byteCount

           mov esi, 0

 

           L2:

                     pop eax ; 스택에서 차례로 빼온다.

                     mov buffer[esi], al 

                     inc esi

                     loop L2

 

           mov edx, OFFSET buffer

           call WriteString ; 재배열(뒤집어진) 문자열을 출력한다.

           call Crlf

           exit

main ENDP

END main

// 스택에 문자열을 push한 이후 다시 pop하여 스택의 구조적 특징인 FILO를 이용해 문자열을 반대로 출력한다.

신고

INCLUDE Irvine32.inc

.data

var1 DWORD 10000h

var2 DWORD 20000h

.code

main PROC

mov eax, var1  ; eax = 00010000

call Dumpregs

add eax, var2  ; eax = 00030000

call Dumpregs 

add ax, 0FFFFh ; eax = 0003FFFF

call Dumpregs

add eax, 1     ; eax = 00040000

call Dumpregs

sub ax, 1      ; eax = 0004FFFF // ax레지스터 0000의 값에서 하나를 빼면 ffff

call Dumpregs

exit

main ENDP

END main




신고

TITLE Add and Subtract


; This program adds and subtracts 32-bit integers.


INCLUDE Irvine32.inc

.code

main PROC

mov eax, 10000h; EAX = 10000h  eax 레지스터에 10000h 대입

add eax, 40000h; EAX = 50000h eax 레지스터값과 40000h값의 합을 eax 레지스터에 대입한다

sub eax, 20000h; EAX = 30000h  eax 레지스터값과 20000h값의 차를 eax 레지스터에 대입한다

call DumpRegs ; display registers 32bit레지스터에 있는 모든 값들을 출력한다.


exit

main ENDP

END main



신고

+ Recent posts

티스토리 툴바