'어셈블리'에 해당되는 글 5건

  1. 2009.10.30 스택 구현
  2. 2009.10.27 색상 행렬
  3. 2009.10.27 무작위 문자열
  4. 2009.10.27 숫자 리스트 거꾸로 출력하기 1
  5. 2009.10.27 문자열 거꾸로 출력하기
INCLUDE Irvine32.inc

.data
loopsize = 5 ;c++의 DEFINE
arr BYTE loopsize DUP(?) ;배열선언
str1 BYTE "Enter 5 numbers : ", 0
str2 BYTE "Reverse 5 numbers : ", 0
str3 BYTE ". ", 0

.code
main PROC
    mov esi, OFFSET arr
    mov edx, OFFSET str1
    call WriteString ;c++의 cout
    call Crlf ;c++의 \n

    mov ecx, loopsize ;루트를 몇번 돌릴지
L1:

    call ReadInt ;c++의 cin
    push eax
    inc esi ;c++의 증가연산자(++)
    loop L1
    call Crlf
    mov edx, OFFSET str2
    call WriteString

    mov ecx, loopsize
    mov edx, OFFSET str3
L2:
    pop eax
    call WriteDec
    call WriteString
    loop L2
    call Crlf

    exit

main ENDP
END main

어셈블리 언어에서 스택은 push명령어와 pop명령어로 이루어져있다.
5개의 숫자를 입력받아서 거꾸로 출력되는 프로그램이다.

c++에서는 입력된 숫자의 개수를 자동으로 알아낼 수 있지만
어셈블리에서는 어떤 방법이 있을까?

흠...곧 알아낼 것이다.
Posted by 정훈승
INCLUDE Irvine32.inc

CHAR_VALUE = '!';

.code
main PROC
    call Clrscr
    mov eax, 0

    mov ecx, 16
L1:
    push ecx ;vary the background colors

    mov ecx, 16
L2:
    SetTextColor ;vary the foreground colors
    push eax
    mov al, CHAR_VALUE
    call WriteChar
    pop eax

    inc al ;next foreground color
    loop L2

    sub al, 16 ;reset forground color to zero
    add al, 16 ;select next backtround color
    call Crlf

    pop ecx
    loop L1

    mov eax, 7
    call SetTextColor

    exit
main ENDP
END main

문자를 모든 가능한 전경색과 배경색의 조합(16*16=256)으로 출력하는 프로그램
색상은 0부터 15까지의 번호가 부여되어서 모든 가능한 조합을 생성하기 위해서 중첩된 루프를 사용할 수 있다
Posted by 정훈승
INCLUDE Irvine32.inc

STR_COUNT = 20
STR_SIZE = 10

.data
aString BYTE STR_SIZE DUP(0), 0

.code
main PROC
    mov ecx, STR_COUNT ;outer loop count

L1:
    push ecx ;save outer loop count

    ;generate a single string
    mov ecx, STR_SIZE ;loop counter
    mov esi, OFFSET aString ;string index

L2:
    mov eax, 26 ;generate random int 0~25
    cal RandomRange
    add eax, 'A' ;range A~Z
    mov [esi], al ;store the character
    inc esi ;next character position
    loop L2

    mov edx, OFFSET aString ;dispay the string
    call WriteString
    call Crlf

    pop ecx ;restore outer loop count
    loop L1 ;repeat outer loop

    exit
main ENDP
END main

A부터 Z까지 중에서 10개의 대문자로 구성되는 20개의 임의의 문자열을 생성하여 표시하는 프로그램
Posted by 정훈승
INCLUDE Irvine32.inc

.data
aName BYTE 10, 20, 30, 40, 50
nameSize = ($ - aName)


.code
main PROC
    mov ecx, nameSize ;리스트 길이만큼 루프 돌린다
    mov esi, 0 ;스택에 리스트 삽입
L1:
    movzx eax, aName[esi] ;리스트 얻는다
    push eax ;스택을 민다
    inc esi ;esi + 1
    loop L1

    mov ecx, nameSize ;다시 루프횟수 설정
    mov esi, 0

L2:
    pop eax ;리스트 얻는다
    mov aName[esi], al
    inc esi

    mov edx, OFFSET aName
    call WriteDec ;리스트출력
    loop L2
    exit

main ENDP
END main

말그대로 숫자 거꾸로 출력하기
Posted by 정훈승
INCLUDE Irvine32.inc

.data
aName BYTE "Hoonseung Jeong", 0
nameSize = ($ - aName) - 1
;마지막에 0은 빼줌

.code
main PROC
    mov ecx, nameSize ;문자열 길이만큼 루프 돌린다
    mov esi, 0 ;스택에 문자열 삽입
L1:
    movzx eax, aName[esi] ;문자열 얻는다
    push eax ;스택을 민다
    inc esi ;esi + 1
    loop L1

    mov ecx, nameSize ;다시 루프횟수 설정
    mov esi, 0

L2:
    pop eax ;문자열 얻는다
    mov aName[esi], al
    inc esi
    loop L2

    mov edx, OFFSET aName
    call WriteString ;문자열출력
    call Crlf ;c++의 \n과 같음
    exit

main ENDP
END main

그냥 말 그대로 문자열 거꾸로
Posted by 정훈승