Форум: "Основная";
Текущий архив: 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