Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.04.24;
Скачать: CL | DM;

Вниз

Результат в регистр AX, как работает компилятор?   Найти похожие ветки 

 
Ruzzz   (2009-09-15 01:29) [0]

Написал такой код:
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?


 
Ruzzz   (2009-09-15 01:34) [1]

THex.High в памяти находится по меньшему адресу чем THex.Low, и из-за обратного порядка байт в маш. слове в интел-совместимых процах, ложится в AL, потому как компилятор грузит в AX слово по адресу который указывает на THex.High. Правильно?


 
Германн ©   (2009-09-15 02:07) [2]


> Ruzzz   (15.09.09 01:29)
>
> Написал такой код:

Не верю!
Ты этот код явно откуда-то содрал!


 
Ruzzz   (2009-09-15 02:13) [3]

Нет Германн, этот код мой собственный, хоть и старый, я не школьник чтобы выдавать чужое за свое, да тут особо и выдавать нечего :)
Кстати вот подправил:
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;


 
Ruzzz   (2009-09-15 02:16) [4]

Удалено модератором


 
Германн ©   (2009-09-15 02:26) [5]


> Ruzzz   (15.09.09 02:16) [4]
>
> Мне вот интересно, не будет ли посыл на йух подобных высказываний
> удален модeратором? :)

Посыл модераторы могут удалить. Это их право.
Тем более от имени анонима.
Но я возражаю против удаления.


> Нет Германн, этот код мой собственный, хоть и старый, я
> не школьник чтобы выдавать чужое за свое

Так зарегистрируйся! Кто или что тебе не позволяет это сделать?
Сам подумай. Как отвечать анониму?


 
Ruzzz ©   (2009-09-15 02:47) [6]

Вообщем что значит «Уже опытным путем определил», это то что код старый, но мой, понадобился, я его просмотрел и исправил, так например в 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:59) [7]


> 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;

А даже если и не передаётся!


 
Сергей М. ©   (2009-09-15 09:14) [8]


> здесь подвох в компиляторе?


Какой подвох-то ?
Нет тут никакого подвоха)
Как ты его попросил, так он тебе и выдал код ..


 
Anatoly Podgoretsky ©   (2009-09-15 10:23) [9]

Нафига это писать на ассемблере, плохо представляя, как оно работает. На Паскале будет наверно эффективнее.



Страницы: 1 вся ветка

Текущий архив: 2011.04.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.011 c
2-1295539697
Ain
2011-01-20 19:08
2011.04.24
Edit


2-1295381178
kokj007
2011-01-18 23:06
2011.04.24
перевести 20.01.10 в HEX(FA,EE,F8,95)


15-1294754988
12
2011-01-11 17:09
2011.04.24
На панели задач хочу название кнопки Delphi7 + Имя_проекта.


15-1294737725
aka
2011-01-11 12:22
2011.04.24
Форум


15-1294926003
12
2011-01-13 16:40
2011.04.24
EhLib v3.6. Нормально работает?