![]() |
|
|
![]()
|
|
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Ув. коллеги! Ситуация такова: я получаю адрес начала таблици в регистрах es:bx, мне необходимо считать из неё пару ячеек со смещениями 0, 2, 14 байт... как это сделать правильно? Я пробовал mov ax, es:[bx+ (кол-во байт)], но судя по тому, какую х... я от туда считываю, что-то делаю не так... помогите, плиз!
|
|||
|
||||
| DenDen |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
push ds
push es pop ds add bx,2; mov ax,[bx] ////// pop ds Если проблема только в замене сегмента и сегмент ты можешь заменять(Linux обычно дает по шапке).Скорее всего проблема в самой таблице. |
|||
|
||||
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Проблема с таблицей, говоришь... может быть. Дело в том, что в эти регистры указывают мне адрес таблицы параметров харда (HDTP), первые 2 байта показывают кол-во дорожек (здесь претензий нет - всё нормально), 3-й байт должен рассказать сколько головок, а 15-й кол-во секторов на дорожку (по идее)... и вот в этих полях у меня и начинается полный бред...
А почему нельзя es:[bx+2]? |
|||
|
||||
| Akina |
|
||||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
можно, можно... а вот почему ты получаешь шелуху - это вопрос... потрасси и глянь куда тебя уносит... Попробуй, кстати, декомпильнуть собранный код - есть ли override сегмента? а то попробуй не
а
|
||||||
|
|||||||
| DenDen |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 25.3.2004 Репутация: нет Всего: нет |
Зависит от асма.
На турбо-асме он выкидывает ворнинг, что игнорирует ":", посему приходится менять сегмент вручную.(по умолчанию ds) На флате вроде работает ничего. Попробуй сделать как написано, если не получиться(и ни 1 большой человек не выскажет свое фи по поводу вышенаписанного), то скорее всего дело в таблице.Если получиться, то получиться. |
|||
|
||||
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Забыл сказать... я делаю гибрид из Си и Асма (работаю в Билдере 3.1) Си использую для вывода на экран, а в Асме работаю с регистрами...
Попробую... надо позарез! Может исходники глянете? |
|||
|
||||
| Chingachguk |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
Код дай...
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
1 #include <iostream.h>
2 void main() 3 { 4 unsigned int cyl; 5 unsigned int heads; 6 unsigned char head; 7 unsigned int sec; 8 unsigned long int a; 9 unsigned long int b; 10 unsigned long int tot; 11 asm mov ax, 0x3541; 12 asm int 0x21; 13 asm mov ax, es:[bx+0]; 14 asm mov cyl, ax; 15 asm mov ax, es:[bx+0x2]; 16 asm mov head, al; //считывать нужно первые 8 бит вроде бы 17 asm mov ax, es:[bx+0xE]; 18 asm mov sec, ax; 19 a = cyl; // 20 b = a * sec; // в одной строке перемножается почему-то неправильно 21 tot = b * head;// 22 heads = tot/b;//head объявлена как char и вместо числа выдаёт символ, пришлось хитрить... 23 cout << "Cylinders = "<< cyl; 24 cout << " Heads = " << heads; 25 cout << " Sectors = " << sec; 26 cout << " Total = " << tot; 27 } |
|||
|
||||
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
...ещё по-поводу таблицы: то что первые три байта содержат кол-во дорожек и головок я уверен на 100% - в нескольких источниках смотрел, а вот по поводу того, что в 15-м кол-во секторов на дорожку - в документации ничего об этом не сказано, я это вычислил из кода проги на асме, которую мне на форуме каком-то дали (не помню, к сожалению на каком)... может быть вы знаете, содержит ли вообще эта таблица (HDTP) информацию о секторах? |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: нет Всего: 454 |
Подробности - в Ralf Brown Interrupt List. |
|||
|
||||
| Chingachguk |
|
||||||||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: нет Всего: 18 |
По поводу получения параметров диска была тема:
http://forum.vingrad.ru/index.php?showtopic=20370 (ты же спрашивал - ?) Насчет того, что у тебя "полный бред" в количестве головок и тд так это очень может быть и не бред, а связано с тем, что давно-давно, когда винты были по 40 мегабайт, количество секторов и тп вполне вмещалось в отведенные ячейки памяти. Сейчас же все стало иначе, поэтому стали делать "нереальное" число головок и тп. Посмотри мой исходник - он же на эту тему: я как раз читал сектора, опираясь на инфу из int 41h:
В си можно все делать неплохо, опираясь на стандартные средства (вроде):
А делал я это вот зачем (моя неопубликованная "статья"):
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||||||||
|
|||||||||||||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 2 Всего: 112 |
Nos, может проблема в том, что у тебя es и bx портятся ? Поди Си использует эти регистры для своих нужд, а ты раз и изменил их ? Поэтому у тебя может значения-то нормальные берутся из HDTP, но при засовывании в переменную улетают куда-нить не туда, или cout не то выводит. Короче, лучше запоминай, а потом восстанавливай все реги, на всякий пожарный (pusha/popa)...
-------------------- С уважением, г-н Посол. |
|||
|
||||
| Nos |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 34 Регистрация: 29.3.2004 Репутация: нет Всего: нет |
Спасибо всем за содействие и желание помочь, уже всё работает! Ошибки были элементарнишие - в моём исходнике необходимо переменную sec определить, как unsigned char, и в нескольких местах работать не со всем регистром ах, а только с половиной...
|
|||
|
||||
| Jin X |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 157 Регистрация: 5.3.2004 Репутация: 1 Всего: 1 |
Кто ж сейчас использует функции ah=0xh/int 13h, пора уже переходить на ah=4xh/int 13h: http://t13.org/docs2004/d1572r1a.pdf
--------------------
Бойся своей мечты, ибо она осуществима! |
|||
|
||||
![]()
|
| Правила форума "Asm: Общие вопросы" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |