2013-06-25 3 views
0

я пытаюсь создать небольшую программу, которая NASM сделать эту операцию с плавающей точкойNASM бесконечный цикл с FPU

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

equivilant программа в 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/i gards всегда одинаковые value = 0 (он должен быть 0) и не уменьшается

ответ

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 16, который говорит NASM, что 16-разрядные операнды по умолчанию и инструкции, использующие 32-разрядные операнды должны иметь префикс. Без этого ваш код будет восприниматься как тарабарщина, если вы попытаетесь выполнить его в среде реального режима.
Возможно, вам понадобится использовать bits 32, в зависимости от вашей целевой среды.
Также обратите внимание на использование литералов с плавающей запятой, а не шестнадцатеричных значений (у вас была опечатка в вашем коде, где вы сравнивали с 10^6 вместо 10^5).