Как обработать число, принятое как байт

Я пытаюсь взять байт информации, реально число и сравнить их. Мои сравнения дают неверные данные. Вот код

program dateDemo;
#include ("stdlib.hhf")

static
    dayR: byte;
    monthR: byte;
    yearR: word;

    day: uns8;
    month: uns8;
    year: uns16;

    packedDate: dword;

begin dateDemo;


    stdout.put( "Enter the current month, day, and year: " );
    stdin.get( monthR, dayR, yearR );

    mov( 0, eax );
    mov(0, bx);
    mov( eax, packedDate ); // Just in case there is an error.

    mov(monthR, ah);
    mov(ah, month);
    mov(dayR, al);
    mov(al, day);
    mov(yearR, bx);
    mov(bx, year);

    // Pack the data into the following bits:
    //
    // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    // m m m m d d d d d y y y y y y y

    if( month > 12 ) then
        stdout.put( "Month value is too large", nl );

    elseif( month = 0 ) then
        stdout.put( "Month value must be in the range 1..12", nl );

    elseif( day > 31 ) then
        stdout.put( "Day value is too large", nl );

    elseif( day = 0 ) then
        stdout.put( "Day value must be in the range 1..31", nl );

    elseif( year > 99 ) then
        stdout.put( "Year value must be in the range 0..99", nl );

    else    
        stdout.put("It worked");

        /*mov( month, al );
        shl( 5, ax );
        or( day, al );
        shl( 7, ax );
        or( year, al );
        mov( ax, packedDate );*/

    endif;

Я пропустил некоторый код, который не имеет значения. Если я введу "10 20 1997", то будет выведено "Месяц слишком большой". Я попытался провести сравнение с несбайтной байтовой информацией, но безрезультатно. Может ли кто-нибудь дать мне советы.

Кроме того, мой год увеличится до 2000, поэтому будет использоваться целое 16-битное слово.

0 ответов

ОКРУЖАЮЩАЯ СРЕДА

  • HLA (ассемблер высокого уровня - серверная часть HLABE, компоновщик POLINK) Версия 2.16, сборка 4413 (прототип)
  • Windows 10

НОТА

  • Код в этом вопросе скопирован из примера dateDemo в главе 2, раздел 11, Битовые поля и упакованные данные, в книге Рэндалла Хайда "Искусство языка ассемблера".

РЕШЕНИЕ

  • Пример demoDate упаковывает и распаковывает word представление даты, поэтому пример следует изменить, чтобы использовать dword длинный упакованный формат даты, если вы хотите использовать word для вашего годового значения.
  • Формат даты с длинной упаковкой:
|31 . . . . . . . . . . . . . . 16|15 . . . . . . 8|7 . . . . . . 0|
| y y y y y y y y y y y y y y y y | m m m m m m m m|d d d d d d d d|

ПРИМЕР

  • Код ниже - это пример demoDate, измененный для обработки dword длинный упакованный формат даты.
program LongDateDemo;
#include ("stdlib.hhf")

storage
    Day:            uns8;
    Month:          uns8;
    Year:           uns16;
    LongPackedDate: dword;

begin LongDateDemo;
    stdout.put("Enter the current month, day, and year (EX: 6 14 2020): ");
    stdin.get(Month, Day, Year);

    // Long packed date format
    // |31 - 16|15 - 8|7 - 0| 
    // |year   |month |day  |

    mov(0, EAX);
    mov(EAX, LongPackedDate ); // Just in case there is an error.

    if( Month > 12 ) then
        stdout.put( "Month value is too large", nl );

    elseif( Month = 0 ) then
        stdout.put( "Month value must be in the range 1..12", nl );

    elseif( Day > 31 ) then
        stdout.put( "Day value is too large", nl );

    elseif( Day = 0 ) then
        stdout.put( "Day value must be in the range 1..31", nl );

    elseif( Year > 65535 ) then
        stdout.put( "Year value must be in the range 0..65535", nl );

    else    
        mov(Year, AX);
        shl(8, EAX);
        or(Month, AL);
        shl(8, EAX);
        or(Day, AL);
        mov(EAX, LongPackedDate);
    endif;

    // Okay, display the packed value:

    stdout.put("Packed data = $", LongPackedDate, nl);

    // Unpack the date:

    mov(LongPackedDate, EAX);
    and($FF, AL);   // Retrieve the day value.
    mov(AL, Day);

    mov(LongPackedDate, EAX);
    shr(8, EAX);
    and($FF, AL);   // Retrieve the month value.
    mov(AL, Month);

    mov(LongPackedDate, EAX);
    shr(16, EAX);
    and($FFFF, AX); // Retrieve the year value.
    mov(AX, Year);

    stdout.put("The date is: ", Month, "/", Day, "/", Year, nl);

end LongDateDemo;
Другие вопросы по тегам