Могу ли я положить все в стек в TASM?

Я новичок в сборке, и любая помощь будет оценена. Вот мой код:

.MODEL SMALL

.DATA  
Textstring db "I'm a string$"
.CODE
START:

mov dx, Textstring
push dx
getche:
    mov ah, 06h
    int 21h
    push al



 END START

Я продолжаю получать сообщения о том, что типы операндов не совпадают в строке 8, а аргумент операции или инструкции имеет неправильный размер в строке 13.
Я думаю, проблема в том, что я пытаюсь подтолкнуть AL в стек. Есть ли в любом случае я мог бы толкнуть содержимое AL в стек? Я пытаюсь создать код, в котором я запрашиваю у пользователя символ и возвращаю этот символ обратно в вызывающую его программу.

2 ответа

Решение

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

Что вы можете сделать, это сброс AHценность и толчок AX в стек так AL будет содержать значение, которое вы хотите, и AH будет просто 0, что не повлияет на данные в AL,

Вы спрашивали об этих 2 ошибках.

типы операндов не совпадают в строке 8

Когда ты пишешь mov dx, Textstring TASM захочет закодировать операцию чтения байта из памяти. Это байт, потому что вы определили строку текста с помощью db директивы. Ошибка не существовала бы, если бы вы написали

mov dl, Textstring

Если вы хотите получить указатель на текст в Textstring, вы должны написать вместо

mov dx, offset Textstring

аргумент операции или инструкции имеет недопустимый размер в строке 13.

ни push ни pop принять операнд размером в байт. Архитектура просто не позволяет этого.

Выдвинуть содержимое регистра байтового размера (например, AL), вы просто нажимаете соответствующий регистр размером слова (AX).
Позже, когда ты pop Эти данные размером с слово, вы просто игнорируете часть, которая не содержала полезного значения. Это может потребовать от вас, чтобы тщательно выбрать регистр, чтобы попасть в!

Другие вопросы по тегам