синтаксис — «У всех было приятное настроение»: правильная грамматическая основа
Перво-наперво. Если вопрос был чисто школьный, о том как учительнице отвечать, то надо отвечать так, как учительница считает. Скорее всего в школе действительно не заморачиваются и принимают за сказуемое то, что лежит на поверхности, т.е. принимают настроение за подлежащее со всеми вытекающими последствиями.
Сложнее с принципиальными разногласиями по поводу структуры. Перечитал я всё тут сказанное.
Во-первых, за сказуемое можно счесть было приятное настроение, но при таком подходе выносить «приятное» за пределы сказуемого было бы нелогичным. Так как нарушалась бы иерархическая структура: некий член предложения (определение «приятное») относился бы к части другого члена (сказуемого «настроение»), не являясь при этом частью самого такого члена (сказуемого).
Остаётся два варианта. Сказуемое «было» и сказуемое «было приятное настроение».
Похоже, камень преткновения в том, как вообще трактовать грамматику.
Но я-то всегда придерживался той позиции, что язык — вещь объективная (за исключением правил правописания) и от наших взглядов на него никак не зависит. Поэтому вопрос о реальном сказуемом вполне уместен. Или придется признать, что у языка две взаимоисключающие грамматики. Но в определении таких базовых вещей как подлежащее, сказуемое, грамматическая основа и проч. существующие описания грамматики никак не расходятся, во всяком случае — не противоречат друг другу. Следовательно, у задачи должен быть один-единственный объективный ответ.
Чем руководствуются сторонники школьного подхода («было» — сказуемое, «настроение» подлежащее)? Только тем, что имеет место согласование (координация) в числе и роде.
Никаких других неавторитарных доводов более не увидел. насколько это довод справедлис — и насколько он императивен? Боюсь, что координация здесь далеко не абсолютная. Примеры с «У них было по рублю» я приводил. Чтобы «отмести» этот контрпример потребовалось сразу же изменить грамматику предложения. Я с таким подходом не согласен. Почему вдруг должна меняться грамматика, если я всего лишь одну «ячейку» структуры заполняю другим словом той же грамматической функции — и подлежащее без видимых причин становится дополнением?С другой стороны, помимо упомянутого требования единства структуры безотносительно к наполнению, есть соображение, что в номинативных языках субъект (производитель действия) и подлежащее — суть одно и то же. «Настроение» никак не может быть производителем действия, это пациенс. Агенс — «все». И я все более склоняюсь к этой трактовке. Все вместе (было хорошее настроение) — сказуемое
Да, забыл сказать, почему настроение — не дополнение.
Попробую для простоты на другом примере. У Васи были родители (вчера, в гостях) — У Васи [находятся] родители.
У Васи были родители (вообще, он не сирота) — У Васи есть родители.
В первом случае родители — подлежащее, «были» — смысловой глагол.
Во втором — глагол связка. Под какой случай подходит «У всех было хорошее настроение»? Я сно, что под второй. Т.е. Если «настроение» — дополнение, то «есть» — глагол связка. Но при нём дополнение в виде именительного падежа (т.е. объектный именительного) возможно только в конструкциях типа «Я — человек» (хотя и тут логичнее «[есть] человек» считать сказуемым). У нас ничего похожего нет. так что доаолнение я на самом деле исключаю.
ЗЫ Я очень надеюсь, что количество минусов не превысит количество критических содержательных комментариев.
c++ — Как дизассемблировать бинарный исполняемый файл в Linux, чтобы получить ассемблерный код?
Этот ответ относится к x86. Портативные инструменты, которые могут дизассемблировать AArch64, MIPS или любой другой машинный код, включают objdump
и llvm-objdump
.
Дизассемблер Агнера Фога, objconv
, довольно приятный. Он добавит комментарии к выходным данным дизассемблирования для проблем с производительностью (например, страшная задержка LCP из-за инструкций с 16-битными непосредственными константами).
objconv -fyasm a.out /dev/stdout | меньше
(Он не распознает -
как сокращение для stdout и по умолчанию выводит в файл с таким же именем, что и входной файл, с добавленным .asm
.)
Он также добавляет цели ветвления в код . Другие дизассемблеры обычно дизассемблируют инструкции перехода только с числовым указанием пункта назначения и не помещают никаких маркеров в цель ветвления, чтобы помочь вам найти вершину цикла и т.д.
Он также указывает NOP более четко, чем другие дизассемблеры (чтобы было ясно, когда есть заполнение, а не дизассемблируется как просто еще одна инструкция.)
Это открытый исходный код, и его легко скомпилировать для Linux. Он может дизассемблироваться в синтаксис NASM, YASM, MASM или GNU (AT&T).
Пример вывода:
; Заполняющее пространство: 0FH ; Тип наполнителя: Многобайтовый NOP ; дБ 0FH, 1FH, 44H, 00H, 00H, 66H, 2EH, 0FH ; дБ 1FH, 84H, 00H, 00H, 00H, 00H, 00H ВЫРАВНИВАТЬ 16 фу: ; Начало функции смр рди, 1 ; 00400620 _ 48:83. ФФ, 01 jbe ?_026 ; 00400624 _ 0F 86, 00000084 мов r11d, 1 ; 0040062A _ 41: ВВ, 00000001 ?_020: движение r8, r11 ; 00400630 _ 4D: 89. Д8 имул r8, r11 ; 00400633 _ 4D: 0F AF. С3 добавить r8, rdi ; 00400637 _ 49:01. F8 см r8, 3 ; 0040063А _ 49:83. F8, 03 jbe ?_029 ; 0040063E _ 0F 86, 00000097 мов эси, 1 ; 00400644 _ БЭ, 00000001 ; Заполняющее пространство: 7H ; Тип наполнителя: Многобайтовый NOP ; дБ 0FH, 1FH, 80H, 00H, 00H, 00H, 00H ВЫРАВНИВАТЬ 8 ?_021: добавить rsi, rsi ; 00400650 _ 48:01. F6 мов ракс, рси ; 00400653 _ 48:89. F0 имул ракс, рси ; 00400656 _ 48: 0F AF. С6 шл ракс, 2 ; 0040065А _ 48: С1. Е0, 02 cmp r8, rax ; 0040065E _ 49:39. С0 ИНЦ ?_021 ; 00400661 _ 73, ЭД lea rcx, [rsi+rsi] ; 00400663 _ 48:8Д. 0С 36 ...
Обратите внимание, что этот вывод готов к сборке обратно в объектный файл, поэтому вы можете настроить код на уровне исходного кода ассемблера, а не с помощью шестнадцатеричного редактора машинного кода. (Таким образом, вы не ограничены сохранением вещей одного размера.) Без изменений результат должен быть почти идентичным. Хотя может быть и нет, поскольку разборка таких вещей, как
(из /lib/x86_64-linux-gnu/libc.so.6) РАЗДЕЛ .plt align=16 выполнить ; секция №11, код ?_00001:; Локальная функция push qword [отн. ?_37996] ; 0001F420 _ ИФ. 35, 003A4BE2(отн.) jmp возле [rel ?_37997] ; 0001F426 _ ИФ. 25, 003A4BE4(отн.) ... ВЫРАВНИВАТЬ 8 ?_00002:jmp рядом с [rel ?_37998] ; 0001F430 _ ИФ. 25, 003A4BE2(отн.) ; Примечание. Непосредственный операнд может быть уменьшен за счет расширения знака. нажать 11 ; 0001F436 _ 68, 0000000B ; Примечание. Непосредственный операнд может быть уменьшен за счет расширения знака. пмп ?_00001 ; 0001F43B _ E9, FFFFFFFE0
не имеет ничего в исходном коде, чтобы убедиться, что он ассемблируется в более длинную кодировку, которая оставляет место для релокаций, чтобы перезаписать его с 32-битным смещением.
Если вы не хотите его устанавливать objconv, GNU binutils objdump -Mintel -d
очень удобен и уже будет установлен, если у вас обычная установка Linux gcc.
linux — Как дизассемблировать необработанный 16-битный машинный код x86?
Если вы просто хотите, чтобы использовал дизассемблер , тогда objdump — один из вариантов. Дизассемблер, входящий в состав ассемблера nasm, называется ndisasm. Вы также можете запустить «debug.exe» в DOS Box на Linux, если у вас есть копия программы. Он также занимается разборкой, а также контролируемым исполнением; то есть моделирование самого ЦП, что также важно даже при разборке по причинам, которые я собираюсь описать.
Fake86 имеет эмулятор процессора. Вы можете заставить его выполнять дизассемблирование, (а) заставив его показывать инструкцию вместо ее симуляции, (б) заставляя его не выполнять условные переходы или вызывать вызовы, а (вместо этого) складывать адрес в качестве новой точки входа в выполнить дизассемблирование (т.
Это приводит к другому смыслу вашего запроса: «Я хочу, чтобы сделал дизассемблером». Исходный код для ndisasm доступен, и он обрабатывает многих потомков 8086, а не только сам 8086 (что сильно загромождает его, если вам нужен только дизассемблер 8086 или даже 80386), но он не самодостаточен и имеет сильная зависимость от остальной части дистрибутива.
Его основная идея заключается в том, что он использует восьмеричные цифры для кодов операций, что лучше подходит для 80×86, как я указал в USENET в 1995 в comp. lang.asm … и (фактически) создание nasm было прямым ответом на это. Таким образом, это потенциально более прозрачно, и вы можете захотеть держать исходный код под рукой для проверки и сравнения, если вы делаете свой собственный дизассемблер.
Вы также можете запустить программу debug.exe на самой себе.
Вы также можете попробовать запустить ndisasm в файле debug.exe; после удаления заголовка файла .EXE размером 0x200 байт, чтобы сделать его необработанным двоичным файлом, после извлечения из него адреса точки входа CS:IP и адреса указателя стека SS:SP (стеки 80×86 растут вниз, поэтому сегмент стека номинально от СС:0 до СС:(SP-1)). EXE для debug.exe не имеет перемещений, поэтому вы можете обрабатывать код как необработанный двоичный файл.
Но ничего четко узнаваемого вы не получите, так как программа является самомодифицирующейся, точнее: самораспаковывающейся. Вы получите (едва) сжатое изображение кода (коэффициент сжатия примерно 5/6), за которым следует процедура загрузки.
Вы должны запустить на нем эмуляцию, т.е. запустив debug.exe на debug.exe, чтобы эмулировать процедуру распаковки, чтобы заставить его извлекать себя, а затем вы выгружаете распакованный образ программы и дизассемблируете его. Там — это «таблица перемещений» в конце процедуры загрузки, так что действительно ли в есть релокации — просто они применяются, когда программа распаковывает себя, а не ОС при загрузке EXE-файла.
И затем вы только что дизассемблировали дизассемблер, который также выполняет эмуляцию процессора, как это делает Fake86, но только для 8086. Вам придется сделать абсолютные адреса относительными (используя исходную таблицу релокации в качестве руководства), сделать повторно сборки. Как только вы это сделаете, вы можете работать с источником. Таблица кодов операций находится в открытом виде (если вы отображаете ее в виде текста) — как в упакованной, так и в неупакованной версиях debug.exe.
На GitHub также есть DosDebug. Он обрабатывает все до «80586» (или Pentium) и «80686»: он помечает поколение «6» для некоторых инструкций; например, он обрабатывает условные операции «cmov», а также их плавающие «fcmov» точки.