Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Результат в регистр 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. Правильно?


Наверх

Титульная страница Поиск, карта сайта Написать письмо