«Немедленные данные» в сборке - PullRequest
1 голос
/ 08 августа 2010

В сборке, когда говорят, что "непосредственные данные" - это подписанные или неподписанные ??

Я пишу эмулятор Gameboy и использую здесь коды операций:

*Например, 1006 *

Код операции 0xC6 - ADD A, d8.

Я предполагаю, что он не подписан, зачем им нужно "SUB A, d8", но я подумал, что я спрошу, пока я проверяю свой код ...

Ответы [ 3 ]

6 голосов
/ 08 августа 2010

В системе комплиментов двоих фактически не имеет значения, подписана она или нет.

Интерпретация значения (и переполнения) происходит при выполнении инструкции сравнения. До этого момента это просто биты. Добавление от 0x8000 к 0x0001 дает 0x8001, независимо от того, подписано ли одно из значений или нет.

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

3 голосов
/ 08 августа 2010

Кажется, что это неподписанный int.Посмотрите на эмулятор процессора MAME LR35902 , для непосредственного использования используется UINT8.

Какой-то соответствующий код:

/* ... */
case 0xC6: /*      ADD A,n8 */
    x = mem_ReadByte (cpustate, cpustate->w.PC++);
    ADD_A_X (x)
    break;
/* ... */

#define ADD_A_X(x) \
     { \
       register UINT16 r1,r2; \
       register UINT8 f; \
       r1=(UINT16)((cpustate->b.A&0xF)+((x)&0xF)); \
       r2=(UINT16)(cpustate->b.A+(x)); \
       cpustate->b.A=(UINT8)r2; \
       if( ((UINT8)r2)==0 ) f=FLAG_Z; \
         else f=0; \
       if( r2>0xFF ) f|=FLAG_C; \
       if( r1>0xF )  f|=FLAG_H; \
       cpustate->b.F=f; \
     }

Теперь подпрограмма для LD HL,SP+n8 имеет вид

case 0xF8: /*      LD HL,SP+n8 */
/*
 *   n = one UINT8 signed immediate value.
 */

  {
    register INT32 n;
    n = (INT32) ((INT8) mem_ReadByte (cpustate, cpustate->w.PC++));

Здесь непосредственное значение приводится к 8-разрядному целому числу со знаком (INT8), так что я представляю, что это в противном случае без знака.

3 голосов
/ 08 августа 2010

Я уже написал ответ о том, что непосредственные данные о процессоре Gameboy, который, кажется, основан на Z-80, подписаны, когда я заметил, что это, вероятно, не совсем точно:

Предположим, что этот ЦП, поскольку кажется, что не существует отдельных кодов операций для операндов со знаком и без знака, на самом деле не различает значения со знаком и без знака. Это будет означать, что отрицательные числа просто кодируются с использованием формы дополнения до двух. Используя эту форму, операция сложения работает одинаково для чисел со знаком или без знака; ЦП просто не волнует.

Однако вам будет важно, когда вы интерпретируете результат. Если приведенное выше предположение верно, это означает, что вы можете интерпретировать результат 8-битного сложения так, как вам хочется, поскольку операция сложения абсолютно одинакова как для подписанных, так и для неподписанных данных.

  • Если вы добавили два значения, которые, по вашему мнению, являются без знака, результат будет находиться в диапазоне 0 - 255.

  • Если вы добавили два значения, которые, как вы полагаете, подписаны (и отрицательные числа были закодированы в форме дополнения до двух), результат будет находиться в диапазоне -128 - 127.

См., Например, эта страница на ассемблере Z-80 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...