Например имеем такой код: Код (Text): .DATA BYTE_0 DB 25H ... ... ... .CODE MOV AX, @data MOV DS, AX ... ... ... A1: XOR AX, AX MOV AX, 25H ; допустимая операция A2: XOR AX, AX MOV AX, BYTE_0 ; ??? A3: XOR AX, AX MOV BX, OFFSET BYTE_0 MOV AX, [BX] ; ??? A4: MOV AX, 534H ; MOV BYTE_0, AX ; недопустимая операция MOV [BX], AX ; недопустимая операция ... ... ... Понятно, что если операнд непосредственный (A1, то ассемблер дополнит 25Н до 0025Н и поместит 00H в АН, а 25H в AL. Итого AX = 0025H. Но интересно как дело обстоит в случае с прямым обращением к памяти (А2 и в случае с непрямым обращением к памяти (А3 ? Тоже дополнится нулями до требуемой приемником размерности или же подобные операции недопустимы (как например А4 ? Иными словами, вопрос можно сформулировать иначе: что происходит, если размерность операнда-источника меньше, чем операнда-приемника (при любой адресации) ?
Guru_of_Zen Это ты асм с си перепутал В асме не бывает разных размеров операндов, кроме как если задано явно (MOVSX, например).
Guru_of_Zen A2: Асм скажет, что размеры не допустимы A3: Асм ничего не скажет, а в AX будет помещены два подряд идущих байта из ячеек памяти адресуемых bx (иными словами эта команда полностью выглядит так mov ax, word [bx] и не важно, что mov bx, offset byte_0, да хоть qword) A4: что касается 3 команды (mov [bx], ax), то это допустимая операция и содержимое ah будет автоматически записано по адресу bx+1 и не важно, что это byte_0 запомните: в ассемблере только вы определяете, что делает программа. компилятору должно быть максимально побоку (масм с этим не согласится и по этой причине начинать лучше с него, а когда надоест писать offset'ы переходите на что-нибудь еще. например fasm или nasm, хотя первое я (лично я) предпочитаю больше чем второе)
PowerASM Это понятно; просто для себя хотел уточнить все возможные можно/нельзя; в действительности же я допустим даже MOV AX, 25H писать не стану. Только MOV AX, 0025H Как бы для наглядности, чтоб видеть чем оперируешь.
Guru_of_Zen я же вам говорил, рановато вы этот ник выбрали, MOV AX, 0025H это не дзенно, дзенно писать MOV AX,100101B, а нормальные пацаны, те вообще пишут MOV AX,37 При программировании на ассемблере "если шестнадцатеричное число начинается с буквы, перед ним обязательно должен ставится ноль. Иначе компилятор решит, что вы имели в виду переменную Ch, а не число 12". Ряд людей с низким уровнем интеллекта, не способным запомнить это правило, ставят ноль впереди всех шестнадцатеричных чисел. Хуже всего, когда такие люди начинают писать учебники...
PowerASM Пусть фраза будет такой "Иначе компилятор решит, что вы имели в виду переменную Eh, а не число 14" согласен, получилась двусмысленность с названием регистра, совсем недавно узнал: чтобы не было двусмысленностей при использовании инструкции .radix 16 для чисел подобных 10B и 10D (то ли 2, то ли 267 в первом случае, и то ли 10, то ли 269 - во втором) в masm были введены суффиксы T (=D) и Y (=B)
Mikl___ Вы наверное в большом опыте, учились по таким или откуда ? Мож сами писали ? Критиковать - оно легко, конечно; а сами не смогли 1-го предложения связать четко, без путаницы - зачем критиковать людей и учебники тогда ?
Я с вами не согласен. Я так делаю. И не из-за того, что "так книжка пишет", а потому-что лично мне в такой записи код читабельнее.
Guru_of_Zen читайте Пильщикова МИФИ к вашему вопросу - например существуют 2 инструкции mov [BX],0 одна посылает ноль как байт другая как слово для того чтоб однозначно указать на размер используются конструкции PTR какая из них подразумевается по умолчанию читайте в документации компилятора