Постепенное увеличение от 0 до 100 в ассемблере

Вы можете выполнить результат, используя шаг sh / bat и readFile:

node {
    sh 'env > env.txt'
    readFile('env.txt').split("\r?\n").each {
        println it
    }
}

К сожалению env.getEnvironment() возвращает очень ограниченную карту переменных среды.

7
задан kristianp 2 May 2012 в 04:21
поделиться

6 ответов

Вы не можете доверять тому, что любая названная процедура делает к любому из регистров. Или продвиньте регистры на стек и вытолкайте их, отступают после вызова printf или имеют инкремент и значения конечной точки, сохраненные в памяти, и читал/писал в регистры, поскольку Вам нужны они.

Я надеюсь следующие работы. Я предполагаю, что pushl имеет эквивалентный popl, и можно продвинуть дополнительные несколько числа на стек.

# count.s: print the numbers from 0 to 100. 
    .text
string: .asciz "%d\n"
    .globl _main

_main:
    movl    $0, %eax # The starting point/current value.
    movl    $100,       %ebx # The ending point.

_loop:
    # Remember your registers.
    pushl   %eax
    pushl   %ebx

    # Display the current value.
    pushl   %eax
    pushl   $string
    call     _printf
    addl     $8, %esp

    # reinstate registers.
    popl   %ebx
    popl   %eax

    # Check against the ending value.
    cmpl    %eax, %ebx
    je    _end

    # Increment the current value.
    incl    %eax
    jmp _loop   

_end:
12
ответ дан 6 December 2019 в 06:52
поделиться

Я не слишком знаком с _printf, но могло случиться так, что это изменяет eax? Printf должен возвратить количество распечатанных символов, который в этом случае равняется двум: '0' и '\n'. Я думаю, что это возвращает это в eax, и когда Вы увеличиваете его, Вы добираетесь 3, который является тем, что Вы продолжаете печатать. Вы могли бы быть более обеспеченным использованием другого регистра для счетчика.

6
ответ дан 6 December 2019 в 06:52
поделиться

Можно безопасно использовать регистры, которые "сохраняются вызываемыми", не имея необходимость сохранять их сами. На x86 это edi, esi, и ebx; другая архитектура имеет больше.

Они документируются в ссылки ABI: http://math-atlas.sourceforge.net/devel/assembly/

5
ответ дан 6 December 2019 в 06:52
поделиться

Nathan на правильном пути. Вы не можете предположить, что значения регистра будут не изменены после вызова подпрограммы. На самом деле, лучше предполагать, что они будут изменены, еще подпрограмма не смогла бы сделать, это - работа (по крайней мере, для низкой архитектуры количества регистра как x86). Если Вы хотите сохранить значение, необходимо сохранить его в памяти (например, продвинуть его на стек и отслеживать, он - местоположение).

Необходимо будет сделать то же для любой другой переменной, которую Вы имеете. Используя регистры для хранения локальных переменных в значительной степени резервируется к архитектуре с достаточными регистрами для поддержки его (например, EPIC, amd64, и т.д.)

1
ответ дан 6 December 2019 в 06:52
поделиться

Вы могли переписать его так, чтобы Вы использовали регистры, которые не являются, предполагают для изменения, например %ebp. Просто удостоверьтесь, что Вы продвигаете их на стек вначале и выталкиваете их прочь в конце Вашей стандартной программы.

# count.s: print the numbers from 0 to 100. 
    .text
string: .asciz "%d\n"
    .globl _main

_main:
    push    %ecx
    push    %ebp
    movl    $0, %ecx # The starting point/current value.
    movl    $100,       %ebp # The ending point.

_loop:
    # Display the current value.
    pushl   %ecx
    pushl   $string
    call     _printf
    addl     $8, %esp

    # Check against the ending value.
    cmpl    %ecx, %ebp
    je    _end

    # Increment the current value.
    incl    %ecx
    jmp _loop   

_end:
    pop     %ebp
    pop     %ecx
-1
ответ дан 6 December 2019 в 06:52
поделиться

Правильно написанные функции будут обычно продвигать все регистры на стек и затем выталкивать их, когда они будут сделаны так, чтобы они остались неизменными во время функции. Исключением был бы eax, который содержит возвращаемое значение. Библиотечные функции как printf, скорее всего, записаны этот путь, таким образом, я не сделал бы, как Wedge предполагает:

Необходимо будет сделать то же для любой другой переменной, которую Вы имеете. Используя регистры для хранения локальных переменных в значительной степени резервируется к архитектуре с достаточными регистрами для поддержки его (например, EPIC, amd64, и т.д.)

На самом деле, от того, что я знаю, компиляторы обычно компилируют функции тот способ точно заниматься этой проблемой.

@seanyboy, Вашим решением является излишество. Все это необходимо, должно заменить eax некоторым другим регистром как ecx.

3
ответ дан 6 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: