2017-12-24 46 views
1

REAL4 데이터 형식을 사용하여 배열에 부동 소수점 숫자를 저장하려고합니다. 다음에 대한 올바른 지침은 무엇입니까?MASM 어셈블리 - REAL4 부동 명령어

  1. 사용자로부터 입력을 받고 배열로 저장 하시겠습니까? 예를 들어 REAL4 번호를 사용합니다.

    mov array[ebx], sval(input()) 
    
  2. 플로트 값을 인쇄하십시오. 유용한 MASM real4 지시 문서에 대한 링크가있는 경우 또 다른 예는,

    mov eax, array[ebx] 
    print str$(eax) 
    

또한 내가, 감사 감사하겠습니다!

+0

'print' 명령어가 없습니다. 아무 것도 인쇄하는 함수를 호출해야합니다. 또는 직접 문자열로 변환하는 코드를 작성해야합니다. 'printf'는'double'과 만 작동하므로'cvtss2sd xmm1, array [ebx]' –

+0

을 원할 수 있습니다. @PeterCordes :'print'는 MASM32 패키지에 포함 된 매크로입니다. – rkhb

답변

1

REAL4 숫자는 DWORD와 같이 32 비트 뭉치지만 다른 방식으로 해석됩니다. 특수 MASM 옵션이 필요하지 않고 REAL4를 확인하는 경우 MASM 유형 DWORD resp를 사용할 수도 있습니다. SDWORD 또는 공통 어셈블러 유형 DD.

대부분의 외부 함수의 경우 REAL4 숫자 (단 정밀도 부동 소수점 형식)를 REAL8 숫자 (배정 밀도 부동 소수점 형식)로 변환해야합니다. 가장 쉬운 방법은 싱글을 FPU에로드하고 이중으로 저장하는 것입니다.

콘솔의 입력 내용이 문자열로 저장됩니다. 이 문자열을 원하는 형식으로 변환해야합니다.

하자 최초의 출력 REAL4 번호의 배열 :

INCLUDE \masm32\include\masm32rt.inc 

.DATA 
    result REAL8 0.0 
    array REAL4 -1.0, 1.2, 2.3, 3.4, 4.567, 0.0 
      SDWORD -1    ; End of array -> NaN 

.CODE 
main PROC 
    xor ebx, ebx 

    @@: 
    mov eax, DWORD PTR array[ebx] ; "DWORD PTR" = "REAL4 PTR" 
    cmp eax, -1      ; NaN = end of array? 
    je @F       ; Yes -> Jump to the next @@ 

    fld DWORD PTR array[ebx]  ; Load a single into FPU ... 
    fstp QWORD PTR result   ; ... and store it as double 
    printf("%f\n",result)   ; MASM32 macro that acts like the C function 

    add ebx, 4      ; REAL4 has 4 bytes 
    jmp @B       ; Jump to the previous @@ 

    @@: 
    exit 0 

main ENDP 

END main 

지금 입력 숫자의 몇하자 그들을 인쇄 할 수 있습니다. 16 개의 변수가 있습니다. 프로그램이 제한을 검사하지 않습니다. 숫자없이 숫자 만 입력하면 입력을 종료합니다.

INCLUDE \masm32\include\masm32rt.inc 
INCLUDE \masm32\macros\macros.asm 

.DATA 
    result REAL8 0.0 
    lpstring DWORD 0 
    array REAL4 16 DUP (0.0) 
      SDWORD -1       ; End of array -> NaN 

.CODE 
main PROC 

    xor ebx, ebx 

    @@: 
    mov esi, input("Enter number here ",62," ") ; Input string ... STRING! 
    cmp BYTE PTR [esi], 0;      ; Nothing inputted? 
    je @F          ; Yes -> jump forward to the next @@ 

    push ebx         ; StrToFloat changes EBX! So it is to save 
    INVOKE StrToFloat, esi, ADDR result   ; Convert string to double 
    pop ebx          ; Restore the saved EBX 

    fld REAL8 PTR result      ; Load a double ... 
    fstp REAL4 PTR array[ebx]     ; ... and save it as single 
    mov eax, -1         ; NaN = end of array 
    mov DWORD PTR array[ebx+4], eax    ; Store the NaN as the next element 

    add ebx, 4         ; Pointer to the next REAL4 in array 
    jmp @B          ; Jump back to the previous @@ 

    @@: 
    xor ebx, ebx 

    @@: 
    mov eax, DWORD PTR array[ebx]    ; "DWORD PTR" = "REAL4 PTR" 
    cmp eax, -1         ; NaN = end of array? 
    je @F          ; Yes -> Jump to the next @@ 

    fld DWORD PTR array[ebx]     ; Load a single into FPU ... 
    fstp QWORD PTR result      ; ... and store it as double 
    printf("%f\n",result)      ; MASM32 macro that acts like the C function 

    add ebx, 4         ; REAL4 has 4 bytes 
    jmp @B          ; Jump to the previous @@ 

    @@: 

    exit 0 

main ENDP 

END main 
+0

가변 인수 함수는'double'으로 변환하면됩니다. 대부분의 C 라이브러리 수학 함수는'float'을 받아서 반환하는'f' 접미어 버전을 가지고 있습니다. 예 : 'sqrtf','sinf','atan2f'. 나는 MSVC의 표준 라이브러리가 이것을 제공한다고 가정하고있다. 또한 x87을 먼저 사용/학습하는 것을 권장하지 않습니다. 32 비트 코드에서도 SSE/SSE2에 대한 지원은 매우 일반적입니다. 'st (0)'에 FP 값을 반환하는 호출 규칙을 사용한다면 x87 만 사용해야합니다. –

관련 문제