Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2012, 21:58   #1
mosxe
Пользователь
 
Регистрация: 22.11.2011
Сообщений: 18
По умолчанию Описание команд в ассемблере

Здравствуйте. Начал изучение ассемблера.
Появились некоторые вопросы по описанию команд:
№1. xchg ax,di
Мнемоника: XCHG ax,r16
КОП: 90+rw
RW= 111b = 7h
Код операции: 97h
Составил вроде правильно, но в симуляторе dosbox пишет команду наоброт. Скриншот внизу. Так должно быть или не правильно я сделал описание?

№2. not byte ptr [bx+800h]
Мнемоника: NOT r/m8
КОП: F6 /2
modR/M:
mod = 10b
REG/КОП=010b
R/M=111b
ModR/M=10010111b=97h
Код операции: F6h97h0008h
Почему здесь надо писать 0008, а не 800?

№3. jnz $+5
КОП: 75
Код операции: 75h5h
Пытаюсь так же в симуляторе написать 75 5, но там либо 75 50, либо 75 05 . Как правильно написать? Думаю все-таки к 75 05.
Все скриншоты внизу!

И еще интересует такой нюанс, есть сложности с определением режимом адрессации. Например, команда xor cx,[si+63h] и какую выбрать из этих списков подходящую команду: XOR ac,im
XOR r/m8,im8
XOR r/m8 ,r8
XOR r8,r/m8
УЛ читал, но что-то не совсем разобрался.
Заранее благодарю!
Ps. сорри за дублирование темы.
Изображения
Тип файла: jpg accembler.jpg (62.9 Кб, 126 просмотров)
mosxe вне форума Ответить с цитированием
Старый 29.02.2012, 17:36   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, почти всё правильно у вас:
я написал так:
Код:
.model  tiny 
.code 
.286 
org     100h 
start:    
  xchg ax,di
  not byte ptr [bx+800h]
  jnz $+5
end start
откомпилировал и получил следующее:
Код:
0000000: 97                           xchg        di,ax
0000001: F6970008                 not         b,[bx][0800]
0000005: 7503                        jne         00000000A
обратите внимание, в последней команде (условный переход) вы не учли, что 5 прибавляется к текущему адресу, а значит нужно отнять длину в байта самой команды перехода

hint. если не ошибаюсь, xchg обменивает местами два регистра, поэтому, по большому счёту, не важно ax, di или di, ax ....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.02.2012, 18:39   #3
mosxe
Пользователь
 
Регистрация: 22.11.2011
Сообщений: 18
По умолчанию

Спасибо. Но не совсем понял "нужно отнять длину байта". Т.е. длина байта = 2 и мы из 5 вычитаем 2 и прибавляем к адресу команды, т.е. 75 + 03? И почему длина байта равняется 2?
И последний непонятный момент: почему в адрес команды not byte ptr [bx+800h] мы пишим F6970008 а не 800? И как собственно, мы получили 0008 из 800?
Заранее спасибо.
mosxe вне форума Ответить с цитированием
Старый 29.02.2012, 20:52   #4
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
Спасибо. Но не совсем понял "нужно отнять длину байта". Т.е. длина байта = 2 и мы из 5 вычитаем 2 и прибавляем к адресу команды, т.е. 75 + 03? И почему длина байта равняется 2?
Не длину байта, а "длину в байтах самой команды перехода" длина команды jne (rel8)= 2 байтам. А вообще очевиднее просто к адресу следующей за jne команды прибавлять непосредственно значение смещения.

Цитата:
И последний непонятный момент: почему в адрес команды not byte ptr [bx+800h] мы пишим F6970008 а не 800? И как собственно, мы получили 0008 из 800?
получили вот так:
Код:
F6|97|00|08
F6|97|A2|A1

A1|A2
08|00
с адресами всегда так.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 29.02.2012, 21:58   #5
mosxe
Пользователь
 
Регистрация: 22.11.2011
Сообщений: 18
По умолчанию

Спасибо. Если, например, было бы 65, то написали бы
Код:
А1А2
0065
и получилось в итоге бы
Код:
F6976500
и все в этом духе. C этим разобрался!
А1А2 - это ячейки адреса команды?
Со 2-ой командой получается: jnz $+5
КОП: 75
Длина команды jne (rel8)= 2 байтам, следовательно 5-2=3h
Общий код операции: 75h03h. Получается так?
Если было бы, например, jnz $+48, то получилось бы: 75h46h?
И откуда мы узнаем длину команды? Где можно в виде таблице посмотреть эти данные как для этой команды, так и для других, например jnb и тд?

Последний раз редактировалось mosxe; 29.02.2012 в 22:07.
mosxe вне форума Ответить с цитированием
Старый 29.02.2012, 22:45   #6
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Цитата:
А1А2 - это ячейки адреса команды?
Да это я так байты обозвал для наглядности. Просто чтобы было понятно, что адрес операнда(в памяти) в команду записывается побайтно, младшим байтом вперёд.

Цитата:
Если было бы, например, jnz $+48, то получилось бы: 75h46h?
Впринципе да, только не 75h46h, а 75h2Eh.
А насчёт таблицы, даже и не знаю. А вообще, зачем вам это?
Собственный компилятор пишите что-ли?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 29.02.2012, 22:57   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
отнять длину в байта самой команды перехода
блин, вот так, опечатаешься, одну букву в конце слова потеряешь (разумеется, подразумевалось "длину в байтах"), и уже куча непоняток возникает...

Хорошо, что благодаря помощи Ulex разобрались с этим вопросом!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.02.2012, 23:48   #8
mosxe
Пользователь
 
Регистрация: 22.11.2011
Сообщений: 18
По умолчанию

Нееет Мне еще очень далеко до компилятора. Стараюсь познать для начала базу.
Вроде все понял, но щас не могу получить что-то код 75h2Eh, если не сложно, можете его расписать как получили?
mosxe вне форума Ответить с цитированием
Старый 29.02.2012, 23:54   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

48 десятичное - это 30h шестнадцатеричное.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 01.03.2012, 08:31   #10
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

вот эта запись
Цитата:
jnz $+48, то получилось бы: 75h46h
была бы верна, если бы вы изначально написали
jnz $+48h
а при той записи, которая была у вас, 48-2 = 46 = 2Eh

и вообще, существуют два варианта хранения данных, можете об этом здесь почитать более подробно:
ссылка
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 01.03.2012 в 08:42.
DiemonStar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание команд в ассемблере mosxe Помощь студентам 0 27.02.2012 21:59
реализация команд с помощью набора других команд zhenyaa Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 08.11.2009 21:37
Задача на ассемблере. Использование команд сдвига. SoundMan Помощь студентам 2 25.09.2008 21:17