2017-10-31 19 views
0

16 진수를 분수로 인쇄 할 수 있기를 원합니다. 하자 .Dintel8086의 16 진수 분수 인쇄

;This macro registers AH,AL 
READ MACRO  
MOV AH,8  
INT 21H 
ENDM 

;This macro registers AH,DL 
PRINT MACRO CHAR 
PUSH AX 
PUSH DX 
MOV DL,CHAR 
MOV AH,2 
INT 21H 
POP DX 
POP AX   
ENDM 
.main: 
READ ;This is Actually .D 
xor ah,ah ; clear it 
; some code to translate ascii to hex  

; Needed code goes here 

나는 16 진수 문자를 읽고 분수로 인쇄하고 싶습니다. 예를 들면 .D는 .8125로 인쇄됩니다.

변환 방법 및 인쇄 방법을 모르겠습니다. 나는 인텔 8086 어셈블리에서만 작업하고있다. 이 사실은 부동 소수점 숫자는 C에서 무엇을하는지 이해하지만 구현 방법을 모르겠습니다.

+0

그래서'x/16'을 소수점으로 인쇄하기를 원합니다. 여기서'x '는 4 비트 정수입니다 (즉, 16 진수 1/16 자리의 한 16 진수). 즉 '0xd/0x10 = 0x0.D = 0.8125'이다. 'hexadecimal fraction'을 위해 google을 사용한다면, 히트 수를 얻을 것이고, 소수점 이하의 값으로 변환하는 것에 대해서는 많은 것을 얻을 것입니다. 히트의 대부분은 부동 소수점을 사용하고 부동 소수점을 십진수로 나눌 수 있지만 (x87 사용) 느리기 때문에 "정수"와 같은 다른 검색어를 포함 할 수 있습니다. –

+0

부동 소수점을 사용할 필요가 없습니다. 당신이하는 일은 사실 고정 소수점 표현입니다 (고정 된 수의 비트는 분수 부분이고 나머지는 정수 부분입니다). 귀하의 경우 4 소수 비트와 정수 비트가 없습니다. 고정 소수점 숫자는 일반적으로 십진수가 아닌 2 진수로 저장되므로 ** 필요한 것은 고정 된 오래된 고정 소수점에서 문자열로 변환 **입니다. 간단한 정수 연산을 사용하는 C 구현에 대해서는 https://codereview.stackexchange.com/a/109219/50567을 참조하십시오 (정수 부분이 다음 십진수가되도록 10을 곱하는 등) –

+0

오직 하나의 16 진수 소수점 인 경우, 그러면 각 16 진수에 대해 올바른 부분을 표시하는 16 개의 문자열 테이블을 가질 수도 있습니다. – Ped7g

답변

0

고정 소수점 - 문자열 변환을 이해하면 대답이 정말 간단했습니다. 기본적으로 0 이하의 모든 비트는 해당 값으로 변환합니다. 알고리즘이 4 비트 밖에 없었기 때문에 알고리즘은 간단했습니다.

//cl has the bits lets say 0000 1111 = 0F 
mov ax,0 
rol cl,5  // I only care for the 4 bit. 
      // So i shift 4 times => 1111 0000 and then a 5th 
jnc next1 // If carry has not set then skip this bit 
add ax,5000 // 1st bit worths 5000 or 1/2 * 10000 to make it an integer 
next1: 
rol cl,1  // Rotate for the next bit 
jnc next2 
add ax,2500 // 2st bit worths 2500 or 1/4 * 10000 to make it an integer 
next2: 
rol cl,1  // Rotate for the next bit 
jnc next3 
add ax,1250 // 3st bit worths 1250 or 1/8 * 10000 to make it an integer 
next3: 
rol cl,1  // Rotate for the next bit 
jnc next4 
add ax,625 // 4th bit worths 625 or 1/16 * 10000 to make it an integer 
next4: 

이제 al 레지스터에 결과가 나타납니다. 우리가 0보다 작은 비트를 가지고 있다면 프로세스를 계속 진행할 것입니다. 아이디어는 이전의 비트가 절반 정도 가치가있는 것입니다. 이 코드는 최적은 아니지만 작동합니다.

+0

'add al, 5000'은별로 의미가 없습니다. 'al'은 8 비트 레지스터이지만 '5000'은 255보다 큽니다. 어셈블러는 상수를 잘라내는 것에 대해 경고해야합니다. 코드를 올바르게 복사 했습니까? 아마 AX를 사용해야 할 것 같습니까? –

+0

주석에 625의 가치가 있다고 말하면 왜 마지막 비트에'add al, 1250'을 사용합니까? –

+0

죄송합니다 @SepRoland typo –