![]() |
АСМ и машинные коды...
Прошу не смеятся уважаемых гуру, мы - ламеры, народ плечистый :))
Вот какой вопрос...по какому принципу сделан асм? Тоесть допустим смотришь в отладчике, int 21 = 0CD21 (или что-то вроди того, точно не помню)...если прерывание номер другое, то меняется только цифра в машинном коде...так вот вопрос асм это тот же машинный код, но сделанный под слова или нет? Мне просто тут друг доказывал, что не может такого быть и асм компилируется по какому-то сложному алгаритму, а не просто "переводится".... помогите кому не влом... Спасибо. |
Nu, nachnem s togo, chto u kajdogo processora swoi ASM. Wozmem komandu wizowa preriwaniya na 80x86: Int NUMBER. Gde number: nomer preriwaniya. W twoem primere eto 21 w schesnadcaterichnoi. Wot prostoi primer multisegmentnoi ASM progi.
Assume SS: SSeg, DS: DSeg, CS: CSeg SSeg Segment Stack SData dw 1024 dup (?) SSeg EndS DSeg Segment SampleData dp 'Pofig' DSeg EndS CSeg Segment Main Proc Mov Dx, Seg DSeg Mov Ds, Dx Mov Ax, 4C00h Int 21h Main EndP CSeg EndS End Main W proge est 3 segmenta. Assembler obrabatiwaet segmenti odin za drugim i perewodit komandi w chisla. Estewstwenno proishodit prowerka chto ti pishesh, i.t.d. Naprimer Mov Es, Ds (skopirowat soderjimoe Ds w Es) rabotat na 86 processore ne budet, t.k. takoi instrukcii _normalnij_ CPU ne znaet. Poluchish oshibku. Segment SSeg - eto stack - tuda padaet informaciya o tochkah wozwrata iz procedur i funkcij i chasto stack ispolzyetsya dlya peredachi informacii mejdu procedurami ili w kachestwe wremennogo hranilischa informacii. Wtoroi segment: DSeg - tam hranyatsya wse staticheskie dannie. Tretij: CSeg - tam hranitsya wipolnyaemij kod. Chto eshe delaet Assembler - eto nakoplenie informacii o metkah. Kajdaya procedura, oboznachenie bloka dannih i prosto adresnaya metka - eto imya kotoroe obrabatiwaet linkowschik pri sbore objektnih failow w odno celoe - t.e. wipolnyaemij fail. |
По поводу сложных алгоритмов - вообще интеловцы постарались в свое время на славу: некоторые операторы могут ассемблироваться аж несколькими вариантами и означать одно и тоже.... + сюда код операции разной длины для разных комманд(и отдельно для AX/AL) + сюда адресации ( на инкрементные они зажались правда, но и обычных в принципе хватает) .....
Вобщем приятное дело... но не для написания дизассемблеров P.S. Почитай справочники (хорошие)по асму - можно найти и коды операций, и системы адресаций и прочую шнягу... блин на днях видел... понравился... названия не помню... :-( p.p.s. to Helldomain - слушай транслит - рулит!!! я наверно раза три перечитывал "schesnadcaterichnoi" пока не понял что ето такое.... :-) |
Вот загрузили-то!:)
Я всего навсего хотел узнать в машинном коде те же команды, что и в асме, только записанные цифрами? Тоесть если выучить "асм в цифрах" это и будет машинный код? |
CYD: Da.
Sh: Translit wsegda rulil ;-))). |
На самом деле надо обратить внимание на слово МАКРО в дополнении с словом ассемблер.
Например, db 20 dup('?') # или что-то вроде этого разворачивается ассемблером в 20 вызовов db. аналогично и многие другие макрофишки. :idea: |
Короче, по жизни асм - словесное выражение машинных кодов. А все остальное - навороты (метки, мат. выражения, макросы), чтобы легче было жить.
Из-за всех этих наворотов и получается, что алгоритм компиляции не такой уж и простой... |
Izwini, no on prosche, chem dopustim algoritm kompila iz C++.
|
У комповой молодежи середины 90х была такая забава - писать проги в VC... Нет, это не то о чем вы, наверняка, подумали. VC - это Volkov Commander (там был hex-редактор). Все очень просто - без IDE, компиляторов и линкеров. Просто жмешь Shift-F4 (новый файл) вводишь имя с расш. ".com" и пофигачил.
FA EB FE - Вешает комп (в реальном режиме и под DOS). E9 FF FF FF FF - Перегружает (тоже только в реальном и, если не ошибаюсь, только для 8086). B8 01 00 CD 10 B8 01 4C CD 21 - устанавливает режим 40x25... Еще прикольные весчи, вплоть до форматирования винтов (через int 13), бикалок при нажатии клавиш (резидент на int 09) и пр... Т.е. ASM переводится по командно. А то, что Sh гнал, про буйство опкодов и адресации, так это ясен перец - CISC-архитектура это вам не RISC с 10-30 командами (кот. выполняют тоже, и даже быстрее). И не интеловцы постарались и не в свое время... Это еще до них известно было и еще до сих пор не известно что лучше _для любой_ задачи. CISC'у цисково, RISC'у - рисково, а другу в репу за такие предположения. :) |
Цитата:
|
Panorama, ne pomny ya chto-to ni odnogo CISC proca s registrom AX i lo-bit AL (kak Sh pisal) ot nego. Mojet nazowesh?
|
2helldomain: Нет, с пямятью у тебя все в порядке :) У каждого проца свои имена регистров. Или ты хочешь сказать, что только Intel одна CISC процы делает?
2Denver: :) :) :) А кто говорил, что писание прог в hex-редакторе - это серьёзно? :) For fun. А вот двумя байтами выбирать горячая или холодная перезагрузка нельзя (на стандартном BIOS), так как это определяется содержимым ячейки где-то в 0040:xxxx, а вот адресовать ее одним-двумя байтами тебе не удасться :) Тем более в зависимости от первого символа (там опкод, а их не так много). Да и какое это теперь имеет значение по прошествии стольких лет? :) |
Цитата:
Цитата:
|
Panorama: konechno, ne tolko Intel, no rech wrode shla o intele - 8086 ya ne mogu nazwat processorom s arhitekturoi CISC - w srawnenii, naprimer, s vektornim blokom processora C90 ili I320 (metafreim IBM).
|
2helldomain: Хех... Но назвать архитектуру x86 RISC архитектурой, я думаю, ты бы тоже не решился :)
2Denver: Найди. Будет интересно :)... Я вот, например, ядерный взрыв несколько раз видел... и зомбей пачками душим... во сне, правда :) Говорю же, что для переключения cold/hot reboot надо в память писать - ну никак не одним-двумя байтами. Может то, что ты видел эксплуатирует какие-то ошибки (напр. эксепшен кинуть для cold boot'а, но так это под QEmm не будет работать...). Короче, действительно интересно будет взглянуть. Если найдешь - напиши. И вообще народ, я свой пост сюда сделал вовсе не чтоб показать как я крут в асме (прошло времени-то сколько, да и занимаюсь, к счастью, не им... да и не был никогда :), а чтоб показать, что да, предложения асма четко транслируются в машкод. С этим все согласны? Ну так хренли на меня набросились с IBM'овскими mainframe'мам на перевес :). |
Hmm...
Nazwat Intel RISC mojno. Nabor instrukcij po srawneniju s temi procami chto ya nazwal... Dostatochno melok i nezameten. |
Немного не то, о чем я говорил, но тоже катит:
Пишешь в HEXе: CD 18 Будет холодная перезагузка, работает только в ДОС (оно даже скажет Press a key to reboot). А то о чем я говорил, ваще нифига не спрашивало и сразу перегружало, но кстати под QEMM паххало 100%, даже теплая перехватывалась by QEMM!). |
Э нет, helldomain. Бедный, убогий или ограниченный commandset - это не тоже самое что "сокращенный".
" Основная идея RISC-архитектуры - это тщательный подбор таких комбинаций кодов операций, которые можно было бы выполнить за один такт тактового генератора. Основной выигрыш от такого подхода - резкое упрощение аппаратной реализации ЦП и возможность значительно повысить его производительность. " - fiton.ru (навскидку из яндекса). А вот "add eax, [esi +ebx *2]" ну ни как не назовешь инструкцией RISC процессора. Тоже самое для MIPS (считаем esi==$a0, ebx==$a1, eax==$v0): sll $t1, $a1 ,1 add $t1, $t1, $a0 lw $t1, $t1 add $v0, $v0, $t1 Вот это RISC. А x86 - это CISC 100% и это известный факт. |
add eax, [esi +ebx *2] - gi, u menya za 4 takta proletaet.
|
Да не в тактах дело, а в _упрощении_ аппаратной реализации. Приведенный add - весьма сложная инструкция (взять ebx, масштабировать его, взять esi и прибавить к предыдущему результату, передать результат в блок генерации адреса и тд), однако она поступает на конвеер как единая и конвеер сам решает какому блоку чего поручить, как сериализовать и пр - это не RISC, где по идее это должно уже быть готово - только смотри на опкод и кидай соответствующему блоку без какой-либо предобработки.
Да и с конвеерами... Да и глупо все это. То, то Intel x86 - CISC, надо бы знать. |
Wse. Ubil ti menya.
|
А Я??? :(
Что ж насчет такой реализации перегрузки (она выше) ??? |
To, chto ti napisal, eto ne peregruzka, a wizow EXT BOOT INT - t.e. esli u tebya w sisteme est setewaya karta s zagruzchikom, to ti wizowesh ee. Nikto ne daet nikakih garantij chto 18h budet peregrujat tachku. Wiziwai 19h.
|
Т.е это как я понял CD 19 в хексе и без всяких "надо в память писать - ну никак не одним-двумя байтами" как писал Panorama???
|
Бр-р-р... Ты, Denver, дай мне оба примера, чтоб можно было и холодный бут делать и горячий. И чтоб на 8086 работала, и чтоб в MS DOS 4.0 (хотя бы)...
Что-то притомился я уже. Если ты говорошь, что видел... ну... значит так оно и есть. А то флейм на пустом месте развели, понимаешь :) |
Ну да, точно - это все таки CD 18 и CD 19
Причем одна из них работает как теплая а другая как холодная перезагрузка. В досе работает (6.22 как минимум, 4го у меня нет) в виндовсе канешна нет. А будет ли она вызывать сетевую карту из доса незнаю, но думаю нет... |
Budet esli karta imeet BOOT ROM.
|
Часовой пояс GMT +4, время: 13:49. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.