Assembly2010. 1. 5. 01:41


main.asm
-------------------------------------------------------------------
.model large
.386

extern ReadBitCountProc:proc

SegData segment
    v_numbers    word    1345h,0F4h,1123h,1212h,12h
    v_bitCount    byte    5 dup (0)    ; 숫자의 1에 대한 각각의 카운트 저장
    v_sortingNumber word    1345h,0F4h,1123h,1212h,12h    ; 소팅된 자료 입력
    v_key        word    5
SegData ends

SegStack segment stack
    byte 100h dup (?)
SegStack ends

SegCode segment   
    mainProc proc
    assume cs:SegCode, ds:SegData, ss:SegStack
    xor  ax, ax
    push ds
    push ax

    mov  ax, SegData
    mov  ds, ax

    xor  si, si    ; word길이씩 증가하는 배열의 인덱스 초기화
    xor  di, di    ; byte길이씩 증가하는 배열의 인덱스 초기화
L_start:
    mov  dx, v_numbers[si]    ; dx에 데이터 입력
    call ReadBitCountProc   
    mov  v_bitCount[di], dl ; 리턴값을 v_bitCount에 저장

    cmp  si, 8    ; 배열의 끝인가 ?
            ; 인덱스가 0 2 4 6 8일때의 값이므로 마지막 인덱스가 8임..
    jz   L_end
    add  si, 2    ; word 배열 인덱스 증가
    inc  di        ; byte 배열 인덱스 증가
    jmp  L_start   

L_end:
    ;--------------------------------------------------------------------------   
    ;    데이터 버블소팅하기
    ;--------------------------------------------------------------------------
    mov  bx, offset v_sortingNumber
    mov  di, v_key
    dec  di
L_01:
    mov  cx, di
    xor  si, si
L_02:
    mov  ax, [bx][si]
    cmp  ax, [bx][si+2]
    jl   L_end2
    mov  dx, [bx][si+2]
    mov  [bx][si], dx
    mov  [bx][si+2], ax
L_end2:
    add  si, 2
    loop L_02

    dec  di
    cmp  di, 0
    jg   L_01

    ret
    mainProc endp
SegCode ends

    end mainProc





sub.asm
-------------------------------------------------------------------
.model large
.386

SegCode segment   
; dx에 입력된 데이터의 1의 숫자를 세어서 dx에 갯수를 출력하는 프로시져
;
; 입력 dx:카운트 하려는 데이터
; 출력 dx:카운트 값
ReadBitCountProc proc
    push cx
    push ax

    xor  cx, cx   
    xor  ax, ax

    mov  cx, 16    ; word길이를 로테이트 하기위해 16번 카운트 설정
L_rotateNumber:
    rcl  dx, 1    ; 캐리를 포함해서 왼쪽으로 1번 쉬프트
    jc   L_addCount ; 캐리가 발생하면 L_addCount로 이동
    loop L_rotateNumber  ; 캐리가 발생하지 않았으면 L_rotateNumber로 이동
    jmp  L_next     ; cx 카운트가 끝났으면 루프 종료
L_addCount:
    inc  ax         ; 리턴값으로 사용할 임시변수에 1 증가
    loop L_rotateNumber

L_next:   
    mov  dx, ax     ; 최종 카운트 갯수 dx에 저장

    pop  ax
    pop  cx
    ret
ReadBitCountProc endp
SegCode ends

    end

'Assembly' 카테고리의 다른 글

[DOS] Serial 통신  (0) 2010.01.05
[DOS] Queue  (0) 2010.01.05
[DOS] 문자열을 입력받아 끝에 $ 추가해서 출력하기  (0) 2010.01.05
[DOS] 10진수를 출력하는 예제  (0) 2010.01.05
[DOS] 어셈블리에서 클래스 구현  (0) 2010.01.05
Posted by houdinist