0

この操作を浮動小数点で行う小さな nasm プログラムを作成しようとしています

while(input <= 10^5) do
begin
   input = input * 10
   i = i - 1
end

nasmの同等のプログラムは次のとおりです

section .data

    input: resd 1
    n10: dd 0x41200000          ; 10

_start:
    mov eax, 0x43480000        ; eax = 200

    mov dword [input], eax      ; input = eax = 200
    mov edx, 0x49742400         ; 10^5

    ; %begin
    mov ecx, 0                  ; i = 0
    jmp alpha

alpha:
    cmp [input], edx            ; input <= 10^5
    jle _while                  
    jmp log2

_while:
    fld dword [input]            ; input
    fmul dword [n10]                ; input * 10
    fst dword [input]            ; input = input
    dec ecx                      ; i = i - 1
    jmp alpha

_whileループは無限に繰り返されます

ecx / igards は常に同じvalue = 0(0 に設定されている) であり、デクリメントしません。

4

1 に答える 1

0

これは私にとってはうまくいきます(DosBoxでテスト済み):

org 0x100
bits 16

_start:
mov dword [input], __float32__(99.0)
mov edx, __float32__(10000.0)  

mov ecx, 0                  ; i = 0
jmp alpha

alpha:
cmp [input],edx            ; input <= 10^5
jle _while                  
jmp log2

_while:
fld dword [input]            ; input
fmul dword [n10]                ; input * 10
fstp dword [input]            ; input = input
inc ecx                      ; i = i - 1
jmp alpha

log2:

; print the value of cl
mov dl,cl
add dl,'0'
mov ah,2
int 21h

; Exit to DOS
mov ah,0x4c
int 21h

n10: dd 10.0 
input: resd 1

bits 1616 ビット オペランドがデフォルトであり、32 ビット オペランドを使用する命令にはプレフィックスを付ける必要があることを nasm に伝える に注意してください。これがないと、リアル モード環境でコードを実行しようとすると、意味不明なコードとして表示されます。ターゲット環境によっては、代わりに
使用する必要がある可能性があります。 また、16 進値ではなく浮動小数点リテラルを使用していることにも注意してください (10^5 ではなく 10^6 と比較するコードにタイプミスがありました)。bits 32

于 2013-06-26T07:23:49.213 に答える