Nano Hash - криптовалюты, майнинг, программирование

Ведущий ноль в расширении знака в сборке x86?

Я прочитал книгу Кипа ИРВИНА Язык ассемблера для процессоров x86, и он написал:

Копирование меньших значений в большие

Хотя MOV не может напрямую копировать данные из меньшего операнда в больший, программисты могут найти обходные пути. Предположим, что count (без знака, 16 бит) должен быть перемещен в ECX (32 бита). Мы можем установить ECX в ноль и переместить счетчик в CX:

.data
count WORD 1
.code
mov ecx,0
mov cx,count

Что произойдет, если мы попробуем тот же подход с целым числом со знаком, равным -16?

.data
signedVal SWORD -16 ; FFF0h (-16)
.code
mov ecx,0
mov cx,signedVal ; ECX = 0000FFF0h (+65,520)

Значение в ECX (+65 520) полностью отличается от -16. С другой стороны, если бы мы сначала заполнили ECX значением FFFFFFFFh, а затем скопировали signedVal в CX, окончательное значение было бы правильным:

mov ecx,0FFFFFFFFh
mov cx,signedVal ; ECX = FFFFFFF0h (-16)

Моя проблема с последней частью. Я думаю, что в первой строке кода выше мы должны были написать mov ecx,FFFFFFFFFh, а не 0FFFFFFFFh. Другими словами, что является ведущим нулем?


  • mov ecx, -1 тоже должно работать. 18.04.2016

Ответы:


1

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

Если вы подсчитаете количество значащих шестнадцатеричных цифр в 0ffffffffh, вы увидите, что их действительно восемь, каждая из которых несет четыре бита информации.
И 8 умножить на 4 равно 32.
Ваш литерал fffffffffh вместо этого имеет длину 36 бит.

Проще говоря, числа типа dah a7h, e0h и т. д. должны быть записаны с 0 в начале.
В вашем уме вы должны автоматически избавляться от лишних нулей.

18.04.2016

2

Чтобы различать символы (т.е. переменные) и числа, вы должны начинать числа с десятичной цифры.

Числовой параметр для mov ecx всегда сохраняется как 32-битный, независимо от количества цифр, которые вы пишете в коде (пока конечное значение меньше 2^32). Ведущие нули игнорируются.

В отличие от C/C++ числа, начинающиеся с 0, не интерпретируются как восьмеричные числа (если это вас беспокоит). Восьмеричные числа начинаются с 0t.

18.04.2016
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..