Нам повезло, что ваша предыдущая версия функции работала без сбоев.
Единственное, что может быть безопасно помещено в функцию naked
, это чистый базовый оператор Asm. https://gcc.gnu.org/onlinedocs/gcc/ARM-Function-Attributes.html . Вы можете разделить его на несколько операторов Basic Asm вместо asm("insn \n\t"
/ "insn2 \n\t"
/ ...);
, но вы должны написать всю функцию в asm самостоятельно.
Хотя использование расширенного asm или смеси базового кода asm и C может показаться работоспособным, от них нельзя полагаться, что они работают надежно, и они не поддерживаются.
blockquote>Если вы хотите запустить код C ++ из голой функции, вы можете
call
обычную функцию (илиbl
в ARM,jal
в MIPS и т. д.), следуя стандартному вызову конвенции.Как по конкретной причине в этом случае? Может быть, создание этого адреса в регистре наступило на функцию args, что привело к неправильной ветке? Проверьте сгенерированный asm, если хотите, но он на 100% не поддерживается.
Или, может быть, он использовал больше регистров, и, поскольку он
naked
не сохранил должным образом / не восстановил регистры, сохраненные при вызове? Я сам не смотрел на генератор кода для поиска голых функций.Вы уверены, что эта функция должна быть
naked
? Я думаю, это потому, что вы манипулируетеlr
, чтобы вернуться в новый контекст.Если вы не хотите просто писать больше логики в asm, возможно, вам нужно, чтобы вызывающая функция выполняла больше работы (и, возможно, передавала ей указатель и / или логические аргументы, говоря ей более просто, что нужно сделать, чтобы ваши входные данные были уже есть в регистрах, и вам не нужен доступ к глобальным переменным).
я нашел это на dotfiles.org как раз сегодня. это очень просто, но умно. я чувствовал себя глупым для то, что не думал о нем сам.
###
### Handy Extract Program
###
extract () {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar xvjf $1 ;;
*.tar.gz) tar xvzf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) unrar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar xvf $1 ;;
*.tbz2) tar xvjf $1 ;;
*.tgz) tar xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "'$1' cannot be extracted via >extract<" ;;
esac
else
echo "'$1' is not a valid file"
fi
}
У меня есть набор серверов, которые я часто подключаю с, также, но они - все в моей локальной сети. Этот сценарий Ruby распечатывает команду для создания псевдонимов для любой машины с открытым ssh:
#!/usr/bin/env ruby
require 'rubygems'
require 'dnssd'
handle = DNSSD.browse('_ssh._tcp') do |reply|
print "alias #{reply.name}='ssh #{reply.name}.#{reply.domain}';"
end
sleep 1
handle.stop
Используйте его как это в Вашем .bash_profile
:
eval `ruby ~/.alias_shares`
Я постоянно соединяюсь с различными серверами Linux от своего собственного рабочего стола всюду по моему рабочему дню, таким образом, я создал несколько псевдонимов, которые запустятся xterm
на тех машинах и наборе заголовок, цвет фона и другие тонкие настройки:
alias x="xterm" # local
alias xd="ssh -Xf me@development_host xterm -bg aliceblue -ls -sb -bc -geometry 100x30 -title Development"
alias xp="ssh -Xf me@production_host xterm -bg thistle1 ..."
Я имею 20 или 30 из этих вещей, лежащих вокруг, потому что, после того как я кодировал платформу для своего стандартного консольного приложения в окнах, я могу в значительной степени заглядывать любой логике, которую я хочу, таким образом, я получил много этих небольших вещей, которые решают определенные проблемы.
Я предполагаю тех, я использую много, прямо сейчас консольное приложение, которое берет stdin и colorizes вывод на основе профилей xml, которые соответствуют регулярным выражениям к цветам. Я использую его для наблюдения моих файлов журнала от сборок. Другой является средством запуска командной строки, таким образом, я не загрязняю свой var ENV ПУТИ, и это превысило бы предел на некоторые системы так или иначе, а именно, win2k.
Любое время, из которого я пишу умное понимание списка или использование, отображает/уменьшает в Python. Был один как это:
if reduce(lambda x, c: locks[x] and c, locknames, True):
print "Sub-threads terminated!"
Причина я помню это, состоит в том, что я придумал его сам, затем видел тот же самый код чьего-либо веб-сайта. В наше время это было бы, вероятно, сделано как:
if all(map(lambda z: locks[z], locknames)):
print "ya trik"
Несколько лет назад я создал комплект приложений на пользовательской платформе веб-приложений в Perl. Одна замечательная функция должна была преобразовать строки SQL-запроса в человекочитаемые предложения, которые описали, каковы результаты были.
Код был относительно короток, но эффект конца был хорош.
У меня есть немного приложения, которое Вы запускаете, и оно выводит GUID в буфер обмена. Можно выполнить его/noui или нет. С UI это - единственная кнопка, которая отбрасывает новый GUID каждый раз, когда Вы нажимаете его. Без него отбрасывает новый и затем выходит.
Я главным образом использую его из VS. У меня есть он как внешнее приложение и отображенный на ярлыке. Я пишу приложение, которое полагается в большой степени на xaml и гуиды, таким образом, я всегда нахожу, что должен вставить новый гуид в xaml...
Я кодировал сценарий Perl для отображения зависимостей, не входя в бесконечный цикл, Для наследия C программа, которую я наследовал...., который также имел ромбовидную проблему зависимости.
Я записал небольшую программу, которая послала мне по электронной почте, когда я получил электронные письма от друзей на редко используемом почтовом ящике.
Я записал другую небольшую программу, которая отправила мне текстовые сообщения если мои домашние изменения IP.
Назвать некоторых.
Вместо того, чтобы иметь необходимость неоднократно открыть файлы в Анализаторе SQL-запроса и выполнить их, я нашел, что синтаксис должен был сделать пакетный файл и мог затем работать 100 сразу. О, сладкая сладкая радость! Я использовал это с тех пор.
isqlw -S servername -d dbname -E -i F:\blah\whatever.sql -o F:\results.txt
У меня есть два рубиновых сценария, которые я изменяю регулярно для загрузки всех различных webcomics. Чрезвычайно удобный!Примечание: Они требуют wget, так вероятно, Linux. Note2: считайте их перед попыткой их им нужна определенная модификация для каждого сайта.
Основанный на дате загрузчик:
#!/usr/bin/ruby -w
Day = 60 * 60 * 24
Fromat = "hjlsdahjsd/comics/st%Y%m%d.gif"
t = Time.local(2005, 2, 5)
MWF = [1,3,5]
until t == Time.local(2007, 7, 9)
if MWF.include? t.wday
`wget #{t.strftime(Fromat)}`
sleep 3
end
t += Day
end
Или можно использовать базирующийся тот числа:
#!/usr/bin/ruby -w
Fromat = "http://fdsafdsa/comics/%08d.gif"
1.upto(986) do |i|
`wget #{sprintf(Fromat, i)}`
sleep 1
end
Извините, не имейте точного кода удобным, но я кодировал регулярное выражение для поиска исходного кода в VS.Net, который позволил мне искать что-либо не в комментариях. Это вошло очень полезное в конкретном проекте, я продолжал работать, где люди настояли, что комментирование кода было хорошей практикой, в случае, если Вы хотели возвратиться и видеть то, что раньше делал код.
Я использую этот сценарий в соответствии с различными Linux, чтобы проверить, работала ли копия каталога между машинами (или к CD/DVD) или ли копирование (например, имена файлов ext3 utf8-> fusebl k) исказил специальные символы в именах файлов.
#!/bin/bash
## dsum Do checksums recursively over a directory.
## Typical usage: dsum <directory> > outfile
export LC_ALL=C # Optional - use sort order across different locales
if [ $# != 1 ]; then echo "Usage: ${0/*\//} <directory>" 1>&2; exit; fi
cd $1 1>&2 || exit
#findargs=-follow # Uncomment to follow symbolic links
find . $findargs -type f | sort | xargs -d'\n' cksum
Этот сценарий сохранил мою карьеру!
Довольно много лет назад я работал удаленно над клиентской базой данных. Я обновил отправку для изменения ее состояния. Но я забыл где пункт.
Я никогда не буду забывать чувство в яме моего живота, когда я видел (6 834 затронутые строки). Я в основном провел всю ночь, проходя журналы событий и выясняя надлежащее состояние на всех тех поставках. Гадьте!
Таким образом, я записал сценарий (первоначально в awk), который запустит транзакцию для любых обновлений и проверит строки, затронутые перед фиксацией. Это предотвратило любые неожиданности.
Таким образом, теперь я никогда не делаю обновления из командной строки, не проходя сценарий как это. Здесь это (теперь в Python):
import sys
import subprocess as sp
pgm = "isql"
if len(sys.argv) == 1:
print "Usage: \nsql sql-string [rows-affected]"
sys.exit()
sql_str = sys.argv[1].upper()
max_rows_affected = 3
if len(sys.argv) > 2:
max_rows_affected = int(sys.argv[2])
if sql_str.startswith("UPDATE"):
sql_str = "BEGIN TRANSACTION\\n" + sql_str
p1 = sp.Popen([pgm, sql_str],stdout=sp.PIPE,
shell=True)
(stdout, stderr) = p1.communicate()
print stdout
# example -> (33 rows affected)
affected = stdout.splitlines()[-1]
affected = affected.split()[0].lstrip('(')
num_affected = int(affected)
if num_affected > max_rows_affected:
print "WARNING! ", num_affected,"rows were affected, rolling back..."
sql_str = "ROLLBACK TRANSACTION"
ret_code = sp.call([pgm, sql_str], shell=True)
else:
sql_str = "COMMIT TRANSACTION"
ret_code = sp.call([pgm, sql_str], shell=True)
else:
ret_code = sp.call([pgm, sql_str], shell=True)
Вот фильтр, который помещает запятые посреди любых больших количеств в стандартном входе.
$ cat ~/bin/comma
#!/usr/bin/perl -p
s/(\d{4,})/commify($1)/ge;
sub commify {
local $_ = shift;
1 while s/^([ -+]?\d+)(\d{3})/$1,$2/;
return $_;
}
Я обычно волную использование его для длинных выходных списков больших чисел, и я утомляюсь подсчетом десятичных разрядов. Теперь вместо наблюдения
-rw-r--r-- 1 alester alester 2244487404 Oct 6 15:38 listdetail.sql
Я могу выполнить это как ls -l | comma
и посмотрите
-rw-r--r-- 1 alester alester 2,244,487,404 Oct 6 15:38 listdetail.sql
Это возвращается к моим дням КОБОЛа, но у меня было две универсальных программы КОБОЛа, один пакет и один онлайн (мейнфреймовые люди будут знать то, что это). Они были оболочками программы, которая могла взять любой набор параметров и/или файлов и быть выполнена, обработать в пакетном режиме или выполняемый в тестовом регионе IMS. Я сделал, чтобы они настроили так, чтобы в зависимости от параметров я мог получить доступ к файлам, базы данных (DB2 или IMS DB) и или просто управлять рабочей памятью или что бы то ни было.
Это было большим, потому что я мог протестировать ту функцию даты, не предполагая или протестировать, почему было усечение или почему была база данных ABEND. Программы увеличились в размере с течением времени, чтобы включать все виды тестов и стать главным продуктом группы разработки. Все знали, где код находился и включал их в их поблочное тестирование также. Те программы стали настолько большими (большая часть кода были прокомментированы тесты), и он был все внесен людьми в течение лет. Они сэкономили так много времени и уладили столько разногласий!