Инструкция MOV не работает наоборот - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь переместить символы, которые не являются цифрами, из массива char «буфер» в новый массив «clean».«буфер» создается с помощью функции scanf.

    .section bss
buffer:
    .skip 20
clean:
    .skip 20

...

if_digit:
    movl    $0, %ebx
cleanloop:  
    movl    $0, %ecx
    movb    buffer(%ebx), %cl
    pushl   %ecx
    call    isdigit     #nonzero if digit.
    addl    $4, %esp
    incl    %ebx
    cmpl    $0, %eax
    jne clean_buffer    #jmp to clean_buffer if digit
    jmp end_cleanloop


clean_buffer:   
    movb    %cl, clean(%ebx)
    jmp     cleanloop

end_cleanloop:
    movb    $0, clean(%ebx) #add null character at the end.     
    pushl   $clean
    call    atoi        #stores atoi value at eax
    addl    $4, %esp
    subl    $4, iIndex  
    pushl   %eax
    jmp     input

Что сомнительно в этих двух строках.

movb buffer(%ebx), %cl

vs

movb %cl, clean(%ebx)

В первой строке хранится определенный символ в буфере для cl.Однако вторая строка не предпринимает никаких действий.Даже когда я проверил с помощью GDB, никакое значение не было сохранено в чистой.

Почему инструкция mov работает в первой строке, а не во второй?

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Я ошибся с incl %ebx. Я увеличил индекс, сохраненный в ebx, прежде чем копировать значение. Эта строка должна идти после movb %cl, clean(%ebx).

Это работает наоборот.

0 голосов
/ 23 мая 2019

Вызов на isdigit приведет к засорению регистра ecx.Таким образом, байт, который хранится в movb %cl, clean(%ebx), вероятно, не тот, который прочитан из buffer.

Вам нужно либо сохранить и восстановить ecx, использовать другой регистр, который сохраняется при вызове функции (esi и edi доступны, хотя вам необходимо сохранить их как часть входа и выхода из функции), или перезагрузить символ из buffer перед сохранением в clean.

...