Как обработать число, принятое как байт
Я пытаюсь взять байт информации, реально число и сравнить их. Мои сравнения дают неверные данные. Вот код
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;