введите два действительных числа в 2 разных массива - PullRequest
0 голосов
/ 08 апреля 2011

Я пытаюсь ввести действительные числа в 2 разных массива

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

есть идеи?


segment .bss
;
segment .data
prompt1     db  "Do you have data to enter? (-1 = yes,0 = no)?: ", 0
prompt2     db  "Enter your Float Value: ", 0   
prompt3     db  "Almost done ",0
segment .text
    extern readdouble,print_string, read_int
    global readarray
readarray:
    pusha
    mov ebx, [esp+36]   ;move starting position into ebx
    mov esi, [esp+40]   ;move max values into edx
    mov edi, 0      ;initialize counter to zero
read_loop:      
    mov     eax, prompt1
    call    print_string
    call    read_int    ;read in decision for prompt
    inc     edi;        increment counter
    cmp eax, 0  
    jz  Done_reading_array1
    jmp continue_loop
continue_loop:
    mov eax, prompt2
    call    print_string
    call    readdouble
    mov     [ebx], ecx  ;move value into memory slot ebx
    mov [ebx+4], edx

    add ebx, 8      ;move to next location for db word
    jmp read_loop
Done_reading_array1:
    sub edi, 1
    mov [esp+40], edi   ;moves counter back to stack
    jmp read_array2
read_array2:
    mov ebx, [esp+68]   ;move starting location of array1 into ebx
    ;mov    esi,[esp+80]    ;move number of items into esi  
    mov ebp, 0
continue_readarray2:
    mov eax, prompt2
    call    print_string

    call    readdouble
    mov     [ebx], ecx  ;move value into memory slot ebx
    mov [ebx+4], edx

    inc ebp
    add ebx, 8      ;move to next location for db word

    cmp ebp, edi
    jz  done_reading_array2
    jmp continue_readarray2

done_reading_array2:
    ;mov    [esp+72],edi
    mov eax, prompt3
    call    print_string
    popa
    ret

Ответы [ 2 ]

0 голосов
/ 08 апреля 2011

Я не вижу, чтобы вы проверяли границы длины выделенного массива в readarray.Например (а может быть, это потому, что ваша маркировка здесь испорчена), но вы, похоже, устанавливаете EBX в качестве начального значения массива, а в ESI - в длину этого массива.Но нигде внутри read_loop и continue_loop я не могу обнаружить, что вы на самом деле проверяете значение ESI, чтобы увидеть, можно ли продолжать увеличивать значение EBX на 8 байт для четырехзначных слов, возвращаемых изreaddouble.Где-то в этом цикле, прежде чем вы увеличите EBX, вам нужно будет проверить доступную оставшуюся длину выделенного массива памяти, на которую указывает EBX, что, как я предполагаю, вы можете построить из информациипередается в ESI (и, надеюсь, ни одна из вызываемых вами функций не уничтожит ESI, в противном случае вам придется сохранить это значение в стеке или в другом регистре сохранения вызовов).

Надеюсь, это поможет,

Джейсон

0 голосов
/ 08 апреля 2011

Я не думаю, что вы должны использовать EBP таким образом во втором цикле, когда вы облажаете кадр стека - почему бы вместо этого не использовать ESI для счетчика.

...