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, поэтому от этой практики отказались)