Linux x86_64 asm, мир hello ничего не печатает [дубликат]

Если вам нужно знать только ключ с максимальным значением, вы можете сделать это без iterkeys или iteritems, потому что итерация через словарь в Python - это итерация через его ключи.

max_key = max(stats, key=lambda k: stats[k])

EDIT :

Из комментариев, @ user1274878:

Я новичок в python.

Yep ...

max

max (iterable [, key])

max (arg1, arg2, * args [, key])

Возвращает наибольший элемент в итерабельном или самом большом из двух или более аргументов.

Дополнительный аргумент key описывает, как сравнивать элементы, чтобы получить максимум среди них:

lambda <item>: return <a result of operation with item> 

Возвращенные значения будут сравниваться.

Dict

Python dict - хеш-таблица. Ключ dict - это хэш объекта, объявленного как ключ. Из-за соображений производительности итерация, хотя dict реализован как итерация через ее ключи.

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

Закрытие

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

Переменная stats, доступная через атрибут __closure__ функции lambda, как указатель на значение переменной, определенной в родительская область.

1
задан Dan Joe 27 April 2018 в 12:12
поделиться

1 ответ

mov msg, %rsi

Эта команда интерпретирует данные в msg как 64-битное значение и загружает это значение в регистр rsi. Инструкция НЕ загружает адрес «msg» в регистр rsi. Это можно сделать (обратите внимание на $):

mov $msg, %rsi

В соответствии с тем, что я прочитал, программа должна вызвать sys_exit, или это будет segfault, но этого не произойдет .

Вы должны знать, почему происходит segfault:

ЦП не знает, где находится «конец» вашей программы. ЦПУ также не может различать команды и данные.

Например, байты 0x8A, 0x07 могут означать mov (%rdi),%al или они могут представлять номер 1930 - ЦП не знает.

Достигнув конца вашей программы, CPU попытается прочитать байты после вашей программы и интерпретировать их как инструкцию.

Теперь возможны три сценария:

  • По мере управления ОЗУ в 4096 байтовых блоках на системах x86. Поэтому в зависимости от длины вашей программы до 4095 байт «неиспользуемой» ОЗУ следуют вашей программе. ЦП будет интерпретировать (случайные) байты в ОЗУ как (ассемблерные) инструкции и выполнять эти инструкции. При достижении конца 4096 байтового блока происходит segfault.
  • 4095 байтов содержат инструкцию, которая вызывает segfault (до достижения конца блока).
  • 4095 байт представляют собой команды, которые вызывают выход программы без каких-либо исключений или бесконечного цикла.

Так что, возможно, в вашем случае это третья ситуация.

1
ответ дан Martin Rosenau 17 August 2018 в 11:23
поделиться
  • 1
    @fuz: используйте lea message(%rip), %rsi для 64-битных статических адресов. mov $msg, %rsi никогда не является лучшим выбором для всего, будь то PIE или не-PIE-исполняемый файл, независимо от того, выбрал ли он 64-битный немедленный или 32-битный расширенный знак. (В исполняемом файле, отличном от PIE, наиболее эффективным выбором является mov $msg, %esi, 5-байтная инструкция.) В моей системе mov $msg, %rsi выбирает movq, а не movabs, поэтому он не будет ссылаться на PIE исполняемый файл. – Peter Cordes 14 July 2018 в 16:36
  • 2
    TL: DR: ваши два хороших варианта: lea msg(%rip), %rsi (PIC) или mov $msg, %esi (не-PIC, статические адреса соответствуют 32 битам) – Peter Cordes 14 July 2018 в 16:43
Другие вопросы по тегам:

Похожие вопросы: