LINUX.ORG.RU

Assembler

 


0

2

думаю,что Вы очень хорошо знакомы с ядром Линукс. поэтому Вам будет очень просто объяснить мне то, что я сам понять не могу.

section .data
var db 'hi LOR'
section .text
global _start
_start:
//в регистр eax я помещаю номер системного вызова. системный возов,, это обращение пользовательской программы к ядру.  потому что сама она не недалена такими полномочиями.

имеет системные вызовы как 1-закрытие файла, 3 -чтение , 5-открытие и тд
mov ebx, 1
в регистр ebx для этой программы я помещаю дискрептор файла.
каждый процесс имеет свой уникальный номер, который называется дискрептор. ребята это из головы. я могу нагородить тут. поэтому пожалуйста поправте и объясните. только правда не смейтесь. отнеситесь серьезно даже к такой глупости, если находите..

и так каждый процесс имеет свой уникальный номер, то есть дискрептор. в Линуксе все файл, поэтому зовется дискрептор файла.  в оболочке по умолчание открыты три файла : стандартный ввод(0) , вывод(1) и поток ошибок(2). 
так как я хочу вывести на экран hi LOR то буду использовать дискрептор 1
mov ebx, 1

mov ecx, var-из этого регистра будет прочитано то что лежало в var
mov edx, 10 -длинна слова в байтах. ну я с запасом взял
int 0x80 -прерывание
mov eax, 1 -закрытие...
int 0x80

прерывание это команда ядру исполнить то что было написанно до него. вернее выше его. 
но как это прочитать? 

то есть системный вызов обратится к ядру, для того чтобы оно взяло из регистра ecx то что там лежит, так как в регистре ebx у нас 1то есть это дискрептор на вывод. значит надо вывести то что лижет в ecx. если бы в ebx лежало 0 то системный вызов ,который хранится в eax, обратился к ядру для того чтобы произошла запись в edx, так как 0 это системный вызов ввода. но о чем говорят тогда 4 или 3 которые лежат в eax? если я говорю mov eax , 4 mov ebx 1 то это значит системный возов на запись и дискрептор на вывод. не логично. записать что? ведь в eax хранится в данном случае номер системного вызова 4 на запись. значит моя программа обращается к ядру чтобы оно сделало запись. а дискрептор файла говорит куда? то есть дискрептор говорит на вывод, а это экран. так?


Ответ на: комментарий от linuxpc

где он будет изначально хранится?

нигде он не будет изначально храниться, нужно сначала open() вызвать

Harald ★★★★★
()
Ответ на: комментарий от Harald

ну я это и имел ввиду , что после открытия

linuxpc
() автор топика
Ответ на: комментарий от WitcherGeralt

Я не врубаюсь почему номера должны быть разными. Поясни, если не сложно.

Они и не должны быть, просто исторически так сложилось. На разных архитектурах могут быть разные номера у одних и тех же сисколлов.

Кстати, коды errno на разных архитектурах тоже могут отличаться. Но там, как минимум в некоторых случаях, это было сделано для «совместимости» с проприетарными юниксами на этих же архитектурах.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

ребята, тогда что могло быть так,что помещая в eax, 4 и в ax, 4 это могло значить разные системные вызова?

linuxpc
() автор топика
Ответ на: комментарий от anonymous

вот все жалуются, что тс непонятно пишет, хотя сами толком ничего объяснить не могут.

Могут, просто желания нет.

Я бы, например, посоветовал бы ТС-у воспользоваться godbolt-ом - сразу бы много вопросов отпало. Но смысл?

reprimand ★★★★★
()
Ответ на: комментарий от linuxpc

Не очень понятно что именно ты имеешь ввиду и при чём тут вообще AX.

Тем не менее, AX - это не настоящий регистр, а только половина (младшие 16 бит) от EAX. Записи только в AX недостаточно, так как в старшей половине EAX может остаться мусор от предыдущего кода.

Аналогично, AL - это младшие 8 бит от AX, AH - соответственно старшие 8 бит AX. Также, на архитектуре x86_64, EAX - это младшие 32 бита от «настоящего» регистра RAX.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 2)
Ответ на: комментарий от reprimand

желание сказать, «А» но не желание говорить «Б» выглядить гнусно в этом случае. тогда зашли тихонько, почитали и дальше продолжайте путь. зайдут понакидают ссылок на техническую литературу , которую написали люди без желания что-то объяснять в ней, как и те кто кидает такие ссылки... бредовой писанины в инете навалом . а вот толковых , понимающих людей мало. поэтому я спросил на этом форуме, где на мой взгляд они есть. и многое стало понятно благодаря им.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Тебе вон там выше уже скинули пдфки где разжёваны ответы на все твои вопросы. Если ты не понимаешь базового английского, то очевидно у тебя проблемы. И либо пиши для 16 битного доса, либо забудь уже про 32 битный ассемблер.

anonymous
()
Ответ на: комментарий от Deleted

щас,попытаюсь объяснить. люди выше пишут, что mov rax, 4 и mov eax, 4 могут быть разными системными вызовами. что есть rax на мой взгляд. это eax расширенный до 64 бит. eax это ax расширенный, то есть «e» extended , с 16 до 32. а процессора 16 битные ,ну когда они были, отличаются от процессором 32 битных. ведь изначально ax были регистрами 16 битных процессоров. это как никрути. и тогда если eax, 4 и rax, 4 могут иметь разные значения , тогда и eax, 4 и ax, 4 также должны иметь разные значения

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Я до последнего ожидал, что ты все таки не дашь ссылку на тред от анонимуса. Просто. Как. Перестать. Орать.

anonymous
()
Ответ на: комментарий от anonymous

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

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

системный вызов, это когда ты через прерывание или через специальную инструкцию обращаешься к коду ядра, чтобы он что-то сделал (выполнил какую-либо функцию), открыл файл, там или записал в сокет.

что касается разрядности регистров, то можешь вот здесь картинку посмотреть https://en.wikipedia.org/wiki/X86#x86_registers

при записи в ax,bx и прочие 16-разрядные, значения старших бит соответствующих регистров (eax/rax,ebx/rbx и т.п.) не обнуляются. то же самое и al,ah,bl,bh и прочими восьмибитными.

запись же в eax,ebx и т.д. обнуляет старшие биты rax,rbx.

если ядро скомпилировано с поддержкой 32-битных программ, то будут возможны и 32-битные системные вызовы, номера которых отличаются от 64-битных. 32-битные сисколы вызываются с помощью инструкции int 0x80, 64-битные с помощью инструкции syscall. то есть на одном и том же фдре возможны два варианта системных вызовов.

anonymous
()
Ответ на: комментарий от anonymous

это же хорошо, что мимо.... я очень рад,что Вы из пеленок понимали Ассемблер, и не задавали вопросы на форуме.

linuxpc
() автор топика
Ответ на: комментарий от anonymous

да, тут все понятно. спасибо Всем. до меня недоходило о дескрипторе, а именно как его найти из кучи созданных ядром. но мне подсказали,что при открытии любого файла, дескриптор, который будет создан ядром, сохранится в eax, если ось 32 битная. как бы все понятно. и зря ругались.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

наверное это потому что системные вызовы, это функции. и значит функции должны возвращать результат туда , откуда они были вызваны. так говорила наша преподаватель. а раз системный вызов был вызван из eax, то и вернуть он что-то должен также в eax. а это может быть хоть что. в нашем случае дескриптор.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Кому должны? Не тупи, в документе который ты почему-то упорно игнорируешь русским по белому написано

%rax temporary register; with variable arguments
passes information about the number of vector
registers used; 1st return register

Можешь ещё тут полуркать хрен его знает. Там весь комплект документов прямо на сайте производителя лежит и ты его не нашёл?

https://developer.amd.com/wordpress/media/2012/10/24592_APM_v11.pdf

anonymous
()

mov ecx, var

Ассемблер знаю только теоретически, но по-моему, в интеловской нотации тут должно быть «mov ecx, offset var».

question4 ★★★★★
()
Ответ на: комментарий от linuxpc

желание сказать, «А» но не желание говорить «Б» выглядить гнусно

Желание потратить чужое время потому что ты не захотел потратить своё собственное время для твоей же нужды выглядит еще более гнусно.

reprimand ★★★★★
()
Ответ на: комментарий от reprimand

Вы неправы. как однажды сказала моя учитель стоя у доски: я уже десять лет преподаю язык СИ но сегодня отвечая на глупый вопрос при объяснении, поняла бинарные деревья еще лучше. я так понял, что повторяя заученное у нее что-то щелкнуло и она реально поняла всю суть. так что не сердитесь, может объясняя мне, Вы и сами поймете на более высоком уровне.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Ну это логично, чтобы преподавать не надо что-либо знать. За это же не платят. А что там понимать, это же дошкольный уровень?

anonymous
()
Ответ на: комментарий от anonymous

ну может быть. тогда почему для всех такие простые вещи трудны для объяснения? чем как им кажется легче вещь, тем при просьбе объяснить, им это дается сложней.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Обычно простые и сами собой разумеющиеся вещи потребуют сложного объяснения, чёткое формулирование которого значительно более затратно, чем обсуждаемый вопрос, и кроме того будет не понятно без объяснения более сложных концепций. А чтобы приводить простые и понятные аналогии, нужно действительно хорошо разбираться в теме, и далеко не каждый тратит время на доскональное зазубривание азов — большинству достаточно того, что необходимое уже отложилось где-то в памяти.

anonymous
()
Ответ на: комментарий от vladimir_vist

не, nasm. потом по совету Гуру здешних мест перейду на GAS)))

где прописывать то макросы? в какой секции?

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

где прописывать то макросы? в какой секции?

Макроопределение при его объявлении не дает никакого кода, который мог бы быть записан в секцию. Намёк понятен?
https://nasm.us/doc/nasmdoc4.html
Аналоги в Си

#define ONE 1
#define INC(x) ((x)+1)

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 2)
Ответ на: комментарий от linuxpc

до всего кода, то всех секций

Нет таких ограничений. Ограничение одно — использование макроопределения должно быть после его объявления. В Си, кстати, точно также.

bormant ★★★★★
()
Ответ на: комментарий от bormant

но директивы же препроцессору указываются до main(). #define-директива препроцессору. ну да ладно, как бы уже про это много мне сказали. только бы еще аргументировали и цены бы таким ответам небыло.

linuxpc
() автор топика
Ответ на: комментарий от linuxpc

Это учитель. Ну или человек, готовый объяснять до посинения. Не всем дан такой талант. Если тебе дали ссылку на релевантную документацию — значит, тебе уже помогли.

Прочти каноничную статью Эрика Реймонда, это второй по полезности для форумчан труд после Розенталя.

hobbit ★★★★★
()
Ответ на: комментарий от linuxpc

но директивы же препроцессору указываются до main()

Откуда взялось это ложное утверждение?
Препроцессор разве умеет разбирать, где main() и до main() он сейчас, или после, или вообще в ней? Препроцессору это не дано, не его это дело, знать, где main().

#include <stdio.h>

int main() {
  // внутри main()
  #define DONE return 0
  DONE;
}

// после main()
#define ONE 1

int test() {
  printf("%d\n",ONE);
  DONE;
}

А говорили, что вы учили Си. Выходит проходили мимо...

bormant ★★★★★
()

Читай книжку крокодилло про линукс и асм

fuzzypants
()
Ответ на: комментарий от bormant

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

linuxpc
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.