Номера ассемблера: MOV AX, 1 ASCII или целое число - PullRequest
0 голосов
/ 14 ноября 2018

В чем разница между

num db 1
mov ax,1

И mov ax, num

Это ASCII или целое число при выполнении mov ax,1?

Я имею в виду, число являетсяне вставлено с клавиатуры, это предопределено, может ли оно попросить преобразовать его в целое число?Это ASCII?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

ASCII - это тип кодировки, т. Е. Как следует интерпретировать определенное числовое значение, например «33 - восклицательный знак» ...

Но процессор не знает ASCII, mov al,33 просто устанавливает al регистр в битовый шаблон 00100001, и когда какой-то другой код будет использовать это значение в качестве символа ASCII (например, рисование некоторого символа из предоставленной графики шрифта в дисплей), он будет отображаться как «восклицательный знак».

На уровне процессора это просто число 33. mov al,'!' и mov al,33 и mov al,21h будут выдавать двоичные идентичные машинные инструкции (загрузка этой битовой комбинации 00100001 в регистр al), для ЦП разницы нет. Вся разница заключается лишь в «форматировании сахара» источника (что облегчает программисту понимание первоначальной цели источника, если ожидается, что число 33 в al будет использоваться как символ ASCII (mov al,'!') или как число значение в некотором расчете (mov al,33)).

Чтобы ввести (в источнике) значение символа ASCII, используйте одинарную кавычку, например mov ax,'1', которая будет собираться как mov ax,49 (в emu8086, MASM и почти во всех других ассемблерах x86, но это особенность ассемблера , вы можете столкнуться с ассемблерами, которые не понимают этот «символьный» синтаксис, и тогда вам придется использовать что-то вроде mov ax,49, чтобы получить тот же результат).


mov ax,num установит al (нижние 8 бит ax) на 1, а ah (старшие 8 бит ax) на какое-то неопределенное значение (вы делаете db 1, но затем вы читать слово, поэтому, чтобы убедиться, что вы загружаете значение слова 1, вы должны определить два байта по адресу num, например num: db 1, 0 или проще для чтения num: dw 1 (опять оба варианта выдают идентичный машинный код для CPU, разница только в в исходном коде).

Если вы определите num: dw 1, то после выполнения mov ax,1 против mov ax,num результат будет идентичным, в обоих случаях ax будет содержать значение 1. Но в первом варианте значение 1 закодировано внутри самой инструкции (B80100 - машинный код для mov ax,1 для 8086 CPU). А во втором варианте (в синтаксисе Intel это mov ax,[num], который я настоятельно рекомендую использовать даже с emu8086 или MASM, чтобы сделать доступ к памяти видимым при чтении исходного кода) действительно читает два байта из памяти (дополнительно к трем байтам) кода операции инструкции, который был прочитан + декодирован ранее).

Таким образом, mov ax,1 будет, вероятно, более производительным в большинстве сценариев, но mov ax,[num] будет более гибким (что-то может изменить значение в памяти, тогда результат будет не более 1, но этот новый измененный значение). ( можно самостоятельно изменить также инструкцию mov ax,1 для изменения значения, закодированного в машинном коде, но эта опция обычно не одобряется, потому что это обычно затрудняет понимание источника и имеет серьезные последствия для производительности и безопасности на современных машинах x86, поэтому от этой практики отказались)

0 голосов
/ 14 ноября 2018

num db 1, определить 1 байт в памяти и инициализировать его целочисленным значением 1.

Mov ax, 1 - режим немедленной адресации, в который передается (копируется) целое число 1 в регистр ax. где, как Mov ax, num - это режим прямой адресации регистра, значение передачи которого содержится в num в регистр ax.

Для ascii вы используете следующую инструкцию

число дБ '1'; определить 1 байт и инициализировать значение '1' ASCII в память

Mov топор, '1'

Mov ax, num

'1' преобразовал свой эквивалентный код ASCII (целое число 49) ассемблером.

...