Если вам также нужно запустить свой код в потоке пользовательского интерфейса (а не по таймеру), посмотрите в блоге: http://steve.odyfamily.com/?p=12
public class myActivity extends Activity {
private Timer myTimer;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
TimerMethod();
}
}, 0, 1000);
}
private void TimerMethod()
{
//This method is called directly by the timer
//and runs in the same thread as the timer.
//We call the method that will work with the UI
//through the runOnUiThread method.
this.runOnUiThread(Timer_Tick);
}
private Runnable Timer_Tick = new Runnable() {
public void run() {
//This method runs in the same thread as the UI.
//Do something to the UI thread here
}
};
}
Проблема с инструкциями условного перехода в 16-разрядном ассемблере заключается в том, что они ограничиваются +127 или -128 байтами для смещения.
386 ввел кодировку jcc rel16
, которая доступна в 16-разрядный режим, но только на 386 и позже. Различные ассемблеры имеют разные опции для включения 386 команд в 16-битном коде
. Некоторые также имеют опции для автоматического выполнения описанных ниже действий: условный jcc rel8
по jmp rel16
. Например, TASM имеет /jJUMPS
.
Допустим, у вас есть это:
cmp al, '1'
jnz ItsNot1
; lots of code here
ItsNot1:
Если вы выпрыгнете из диапазона вы можете перекодировать его так:
cmp al, '1'
jz Its1
jmp ItsNot1
Its1:
; lots of code here
ItsNot1:
Все, что я сделал, это изменение смысла сравнения и переход вокруг безусловного перехода, который приведет вас к альтернативному коду.
Иногда это раздражает, если у вас много условных прыжков. Вы перекодируете один из них, и это вызовет другое. И тогда вы реорганизуете код и обнаружите, что некоторые из этих искаженных условностей могут исчезнуть. Обычно я не беспокоюсь об этом, если меня серьезно не беспокоит размер кода.
Некоторые ассемблеры имеют переключатель, который будет делать автоматическое определение размера для вас, чтобы вы всегда могли кодировать условные переходы,
Скорее всего, разница между
PRINT 'something'
и
call PTHIS
db 13, 10, 'something'
Является ли это первой один - это макрос, который расширяется до полного кода для печати, плюс строка, которую вы хотите распечатать. Вторая - простая команда call
(3 байта) плюс строка. Или, в терминах C ++, макрос PRINT
похож на встроенную функцию, а call PTHIS
является обычным (не встроенным) вызовом функции.
Иногда вам приходится отрицать ваш тест и заставлять ветвь просто немного продвигаться вперед, а провал - безусловный переход к вашему месту вне пределов дальности.
jcc rel16
в 16-битном режиме . До этого даjcc rel8
была единственной кодировкой для условных ветвей, и толькоjmp
/call
мог двигаться дальше. Так что да, если вы не смогли бы перестроить свой код, чтобы избежать необходимости в более длинных условных ветвях, то условно перепрыгнуть черезjmp
было возможным. – Peter Cordes 18 April 2018 в 00:02