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 |