Выйти из диапазона [дублировать]

Если вам также нужно запустить свой код в потоке пользовательского интерфейса (а не по таймеру), посмотрите в блоге: 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

    }
};
}

3
задан lisovaccaro 25 June 2013 в 22:25
поделиться

2 ответа

Проблема с инструкциями условного перехода в 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 является обычным (не встроенным) вызовом функции.

4
ответ дан Peter Cordes 20 August 2018 в 11:28
поделиться
  • 1
    386 введен jcc rel16 в 16-битном режиме . До этого да jcc rel8 была единственной кодировкой для условных ветвей, и только jmp / call мог двигаться дальше. Так что да, если вы не смогли бы перестроить свой код, чтобы избежать необходимости в более длинных условных ветвях, то условно перепрыгнуть через jmp было возможным. – Peter Cordes 18 April 2018 в 00:02

Иногда вам приходится отрицать ваш тест и заставлять ветвь просто немного продвигаться вперед, а провал - безусловный переход к вашему месту вне пределов дальности.

0
ответ дан Loren Pechtel 20 August 2018 в 11:28
поделиться
Другие вопросы по тегам:

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