Вы можете выполнить результат, используя шаг sh
/ bat
и readFile
:
node {
sh 'env > env.txt'
readFile('env.txt').split("\r?\n").each {
println it
}
}
К сожалению env.getEnvironment()
возвращает очень ограниченную карту переменных среды.
Вы не можете доверять тому, что любая названная процедура делает к любому из регистров. Или продвиньте регистры на стек и вытолкайте их, отступают после вызова 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:
Я не слишком знаком с _printf, но могло случиться так, что это изменяет eax? Printf должен возвратить количество распечатанных символов, который в этом случае равняется двум: '0' и '\n'. Я думаю, что это возвращает это в eax, и когда Вы увеличиваете его, Вы добираетесь 3, который является тем, что Вы продолжаете печатать. Вы могли бы быть более обеспеченным использованием другого регистра для счетчика.
Можно безопасно использовать регистры, которые "сохраняются вызываемыми", не имея необходимость сохранять их сами. На x86 это edi, esi, и ebx; другая архитектура имеет больше.
Они документируются в ссылки ABI: http://math-atlas.sourceforge.net/devel/assembly/
Nathan на правильном пути. Вы не можете предположить, что значения регистра будут не изменены после вызова подпрограммы. На самом деле, лучше предполагать, что они будут изменены, еще подпрограмма не смогла бы сделать, это - работа (по крайней мере, для низкой архитектуры количества регистра как x86). Если Вы хотите сохранить значение, необходимо сохранить его в памяти (например, продвинуть его на стек и отслеживать, он - местоположение).
Необходимо будет сделать то же для любой другой переменной, которую Вы имеете. Используя регистры для хранения локальных переменных в значительной степени резервируется к архитектуре с достаточными регистрами для поддержки его (например, EPIC, amd64, и т.д.)
Вы могли переписать его так, чтобы Вы использовали регистры, которые не являются, предполагают для изменения, например %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
Правильно написанные функции будут обычно продвигать все регистры на стек и затем выталкивать их, когда они будут сделаны так, чтобы они остались неизменными во время функции. Исключением был бы eax, который содержит возвращаемое значение. Библиотечные функции как printf, скорее всего, записаны этот путь, таким образом, я не сделал бы, как Wedge предполагает:
Необходимо будет сделать то же для любой другой переменной, которую Вы имеете. Используя регистры для хранения локальных переменных в значительной степени резервируется к архитектуре с достаточными регистрами для поддержки его (например, EPIC, amd64, и т.д.)
На самом деле, от того, что я знаю, компиляторы обычно компилируют функции тот способ точно заниматься этой проблемой.
@seanyboy, Вашим решением является излишество. Все это необходимо, должно заменить eax некоторым другим регистром как ecx.