2010-03-11 6 views

답변

2

가장 간단한 방법은 숫자를 16 진수로 변환하는 것입니다. 4 비트의 각 그룹은 16 진수가됩니다.

; this is pseudocode 
mov di, [addr_of_buffer] ; use the string instructions 
cld      ; always remember to clear the direction flag 

; convert bx 
mov cx, 4 ; 4 hexits per 16 bit register 
hexLoopTop: 
mov al, bl ; load the low 8 bits of bx 
and al, 0x0F ; clear the upper 4 bits of al 
cmp al, 10 
jl decimal 
add al, 65 ; ASCII A character 
jmp doneHexit: 
decimal: 
add al, 48 ; ASCII 0 character 
doneHexit: 
stosb  ; write al to [di] then increment di (since d flag is clear) 
ror bx  ; rotate bits of bx down, happens 4 times so bx is restored 
loop hexLoopTop 

; repeat for si, note that there is no need to reinit di 

이제 10 진수 출력을 원한다면 다소 복잡한 알고리즘이 필요합니다. 이를 수행하는 분명한 방법은 반복되는 나누기입니다. 32 비트 CPU (386 이상)를 사용하는 경우 16 비트 모드에서 32 비트 레지스터를 사용할 수 있으므로이 작업을 더 쉽게 수행 할 수 있습니다.

시작하려면 si : bx를 eax로 이동하십시오. 다음 자릿수를 얻으려면 cdx 명령을 실행하여 eax를 edx로 확장하십시오. eax, div로 10을 지정하고 나머지는 edx에서 다음 자릿수입니다. eax의 몫은 끝난 경우 0이거나 루프의 다음 라운드를위한 입력입니다. 그러면 가장 중요한 자리가 먼저 표시되므로 완료되면 자리를 반대로해야합니다. 버퍼는 최소한 10^2^32의 기본 10 로그 여야합니다.이 알고리즘을 부호있는 정수로 작동하도록 조정하는 것은 그리 어렵지 않습니다.