![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Результат в регистр AX, как работает компилятор?
Ruzzz © (2009-09-15 01:29:00)Написал такой код:
type
THex = record
High, Low: AnsiChar;
end;
function CharToHex(Value: AnsiChar): THex;
asm
// Byte -> al Result -> ax
mov ah, al
shr al, 4 // THex.High
add al, '0'
cmp al, '9' + 1
jb @01
add al, 'A' - '0' - 10
@01: and ah, $0F // THex.Low
add ah, '0'
cmp ah, '9' + 1
jb @02
add ah, 'A' - '0' - 10
@02:
end;
function HexToChar(Value: THex): AnsiChar;
asm
// Hex -> ax Result -> al
sub al, '0' // THex.High
cmp al, 10
jb @01
sub al, 'A' - ('9' + 1)
cmp al, 17
jb @01
sub al, 'a' - 'A'
@01:
sub ah, '0' // THex.Low
cmp ah, 10
jb @02
sub ah, 'A' - ('9' + 1)
cmp ah, 17
jb @02
sub ah, 'a' - 'A'
@02:
shl al, 4
or al, ah
end;
Уже опытным путем определил что THex.High в AL, но почему не в AH? Чего я не понимаю? Подскажите что нужно уяснить, чтобы не было подобных вопросов? Обратный порядок байт в "слове" на x86 процессорах как-то не могу сюда применить? Или это оно и есть? Или это работа компилятора? Возможно связано с тем что THex.High в памяти находится по меньшему адресу чем THex.Low?
Anatoly Podgoretsky (2009-09-15 10:23:00) [1]Нафига это писать на ассемблере, плохо представляя, как оно работает. На Паскале будет наверно эффективнее.
Сергей М. (2009-09-15 09:14:00) [2]
> здесь подвох в компиляторе?
Какой подвох-то ?
Нет тут никакого подвоха)
Как ты его попросил, так он тебе и выдал код ..
Германн (2009-09-15 02:59:00) [3]
> Ruzzz © (15.09.09 02:47) [6]
Поздравляю нового зарегистрированного!
> То есть нужно просто запомнить что если структура передается
> в качестве параметра через регистр, или в качестве результата
> (eax), то:
> TMyRecord = record
> byte_AL: byte; // ax low byte
> byte_AH: byte; // ax high byte
> end;
>
> или
>
> TMyRecord = record
> word1: word; // eax low word
> word2: word; // eax high word
> end;
А даже если и не передаётся!
Ruzzz (2009-09-15 02:47:00) [4]Вообщем что значит «Уже опытным путем определил», это то что код старый, но мой, понадобился, я его просмотрел и исправил, так например в function CharToHex: and al, $0F (а не ah) ну и shr ah, 4 - подумал что когда писал этот код то ошибся, но проверил, таки нет, вернул обратно, стал думать а почему это так :) Вопрос в том что как мне кажется здесь подвох в компиляторе?
То есть нужно просто запомнить что если структура передается в качестве параметра через регистр, или в качестве результата (eax), то:
TMyRecord = record
byte_AL: byte; // ax low byte
byte_AH: byte; // ax high byte
end;
или
TMyRecord = record
word1: word; // eax low word
word2: word; // eax high word
end;
Может ночь а может устал, но почему то мне не показалось это очевидным. Посмотрел в дебаггере, вроде прояснилась ситуация
Германн (2009-09-15 02:26:00) [5]
> Ruzzz (15.09.09 02:16) [4]
>
> Мне вот интересно, не будет ли посыл на йух подобных высказываний
> удален модeратором? :)
Посыл модераторы могут удалить. Это их право.
Тем более от имени анонима.
Но я возражаю против удаления.
> Нет Германн, этот код мой собственный, хоть и старый, я
> не школьник чтобы выдавать чужое за свое
Так зарегистрируйся! Кто или что тебе не позволяет это сделать?
Сам подумай. Как отвечать анониму?
Ruzzz (2009-09-15 02:16:00) [6]Удалено модератором
Ruzzz (2009-09-15 02:13:00) [7]Нет Германн, этот код мой собственный, хоть и старый, я не школьник чтобы выдавать чужое за свое, да тут особо и выдавать нечего :)
Кстати вот подправил:
function HexToChar(Value: THex): AnsiChar;
asm
// Hex -> ax Result -> al
sub al, '0' // THex.High
cmp al, 10
jb @01
and al, 16 - 9 // 7, берем только значащие биты, 'a'/'A' -> 1, и т.д.
add al, 9 // корректируем, 'a' -> 10, и т.д.
@01:
sub ah, '0' // THex.Low
cmp ah, 10
jb @02
and ah, 16 - 9
add ah, 9
@02:
shl al, 4
or al, ah
end;
Германн (2009-09-15 02:07:00) [8]
> Ruzzz (15.09.09 01:29)
>
> Написал такой код:
Не верю!
Ты этот код явно откуда-то содрал!
Ruzzz (2009-09-15 01:34:00) [9]THex.High в памяти находится по меньшему адресу чем THex.Low, и из-за обратного порядка байт в маш. слове в интел-совместимых процах, ложится в AL, потому как компилятор грузит в AX слово по адресу который указывает на THex.High. Правильно?