Size: a a a

Ассемблер

2020 December 21

АМ

Алексей Маринченко... in Ассемблер
Я понял, спасибо. Чёт туплю 😂
источник

АМ

Алексей Маринченко... in Ассемблер
Значит после goto start он не остановится и пойдет дальше по коду, пока не встретит goto или выход из программы, так?
источник

楽園松本 in Ассемблер
Алексей Маринченко
Я понял, спасибо. Чёт туплю 😂
В NASM есть фишка. Если метка начинается с точки, то NASM видит эту метку в пределах участка кода, который ограничен метками без точек. То есть типо "локальная" метка. Но это фишка NASM.
источник

楽園松本 in Ассемблер
Алексей Маринченко
Значит после goto start он не остановится и пойдет дальше по коду, пока не встретит goto или выход из программы, так?
Да. Процессор будет заглатывать следующий опкод и выполнять его. И так до бесконечности, пока есть электричество.
источник

АМ

Алексей Маринченко... in Ассемблер
.start
metka
goto start
На metka в NASM не пойдет, только start выполнит?
источник

АМ

Алексей Маринченко... in Ассемблер
楽園松本
Да. Процессор будет заглатывать следующий опкод и выполнять его. И так до бесконечности, пока есть электричество.
Понял, спасибо
источник

楽園松本 in Ассемблер
Алексей Маринченко
.start
metka
goto start
На metka в NASM не пойдет, только start выполнит?
NASM скажет, что я не вижу .start -- тк после metka он её забыл.
источник

АМ

Алексей Маринченко... in Ассемблер
楽園松本
NASM скажет, что я не вижу .start -- тк после metka он её забыл.
Аааа
источник

АМ

Алексей Маринченко... in Ассемблер
Ну ладно, до насма я еще не дошел
источник

楽園松本 in Ассемблер
Но это поведение NASM. Другие ассемблеры будут вести себя иначе.
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Алексей Маринченко
.start
metka
goto start
На metka в NASM не пойдет, только start выполнит?
Если точку убрать, то пойдёт, потому что метки — это абстракция языка.
Физически она ни во что не компилируется. Там не будет никакого перехода.

Ты знаешь C или C++ ?
Там есть такой оператор switch, а case — это метки. Если нет break, то выполнение идёт дальше, к следующей метке.
Тут аналогично:

jmp b
a:
 inc ax
b:
 inc bx
c:
 inc cx
d:
 inc dx

Здесь будет выполнено
  inc bx
 inc cx
 inc dx
источник

АМ

Алексей Маринченко... in Ассемблер
楽園松本
Но это поведение NASM. Другие ассемблеры будут вести себя иначе.
Да, я понял
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Есть ещё локальные метки — они как бы внутри глобальных. Но это опять же, абстракция.
К локальным просто нельзя обратиться вне текущей глобальной, не более.

a:
 .x:
   jmp .z
 .y:
b:
 .z:
   jmp .x

Здесь оба jmp некорректны, потому что .z находится в области видимости b, а .x — в области видимости a.
В fasm такой код фактически превращается в следующий:

a:
 a.x:
   jmp a.z
 a.y:
b:
 b.z:
   jmp b.x

Понятно теперь, почему jmp b.x не сработает? Нет такой метки!

Но принцип (в fasm, nasm, где угодно) тот же — код выполняется последовательно, если нет переходов (или вызовов, из которых нет возврата).

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

АМ

Алексей Маринченко... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Если точку убрать, то пойдёт, потому что метки — это абстракция языка.
Физически она ни во что не компилируется. Там не будет никакого перехода.

Ты знаешь C или C++ ?
Там есть такой оператор switch, а case — это метки. Если нет break, то выполнение идёт дальше, к следующей метке.
Тут аналогично:

jmp b
a:
 inc ax
b:
 inc bx
c:
 inc cx
d:
 inc dx

Здесь будет выполнено
  inc bx
 inc cx
 inc dx
Я знаю синтаксис практически всех C - подобных языков, но программирую только на Python
источник

АМ

Алексей Маринченко... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Есть ещё локальные метки — они как бы внутри глобальных. Но это опять же, абстракция.
К локальным просто нельзя обратиться вне текущей глобальной, не более.

a:
 .x:
   jmp .z
 .y:
b:
 .z:
   jmp .x

Здесь оба jmp некорректны, потому что .z находится в области видимости b, а .x — в области видимости a.
В fasm такой код фактически превращается в следующий:

a:
 a.x:
   jmp a.z
 a.y:
b:
 b.z:
   jmp b.x

Понятно теперь, почему jmp b.x не сработает? Нет такой метки!

Но принцип (в fasm, nasm, где угодно) тот же — код выполняется последовательно, если нет переходов (или вызовов, из которых нет возврата).

Даже когда программа закончилась, если там нет кода выхода из программы, выполнение пойдёт дальше. В область, заполненную каким-то данными (для простоты можно считать, что случайными).
Я понял, спасибо)
источник

АМ

Алексей Маринченко... in Ассемблер
И ещё такой вопрос. Прерывания часто сравнивают с функциями, но в них ничего не передают. Но предварительно заполняют регистры. Правильно ли я понимаю что прерывания берут данные из регистров?
источник

АМ

Алексей Маринченко... in Ассемблер
Eugene Krasnikov (ᴊɪɴ x)
Есть ещё локальные метки — они как бы внутри глобальных. Но это опять же, абстракция.
К локальным просто нельзя обратиться вне текущей глобальной, не более.

a:
 .x:
   jmp .z
 .y:
b:
 .z:
   jmp .x

Здесь оба jmp некорректны, потому что .z находится в области видимости b, а .x — в области видимости a.
В fasm такой код фактически превращается в следующий:

a:
 a.x:
   jmp a.z
 a.y:
b:
 b.z:
   jmp b.x

Понятно теперь, почему jmp b.x не сработает? Нет такой метки!

Но принцип (в fasm, nasm, где угодно) тот же — код выполняется последовательно, если нет переходов (или вызовов, из которых нет возврата).

Даже когда программа закончилась, если там нет кода выхода из программы, выполнение пойдёт дальше. В область, заполненную каким-то данными (для простоты можно считать, что случайными).
Интересно, спасибо
источник

АМ

Алексей Маринченко... in Ассемблер
Алексей Маринченко
И ещё такой вопрос. Прерывания часто сравнивают с функциями, но в них ничего не передают. Но предварительно заполняют регистры. Правильно ли я понимаю что прерывания берут данные из регистров?
Или зачем предварительно их заполнять? И как передавать в них данные?
источник

ST

Saenro T in Ассемблер
На примере какого прерывания?
источник

EK

Eugene Krasnikov (ᴊɪ... in Ассемблер
Алексей Маринченко
И ещё такой вопрос. Прерывания часто сравнивают с функциями, но в них ничего не передают. Но предварительно заполняют регистры. Правильно ли я понимаю что прерывания берут данные из регистров?
В основном да.
Изучай: http://www.ctyme.com/intr/int.htm
источник