Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2011.04.24;
Скачать: [xml.tar.bz2];

Вниз

Результат в регистр 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;
Скачать: [xml.tar.bz2];

Наверх





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


6-1191246733
__Unnamed__
2007-10-01 17:52
2011.04.24
Вопрос про сокеты, а точнее про FD_CLOSE и FD_READ


2-1295426993
Евгений07
2011-01-19 11:49
2011.04.24
как обеспечить доступ к данным между родительскими формами


15-1294985178
Медвежонок ХМЛ
2011-01-14 09:06
2011.04.24
УЭК


15-1294349396
Юрий
2011-01-07 00:29
2011.04.24
С днем рождения ! 7 января 2011 пятница





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский