Невозможно записать в переменную (ASM) - PullRequest
0 голосов
/ 05 января 2011

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

leftbr db "("
rightbr db ")"
input db

start:
mov ah,08
int 21h
mov input,al

output:
mov dl,leftbr
mov ah,02
int 21h
mov dl,key
int 21h
mov dl,rightbr
int 21h

exit:
mov ah,4ch
mov al,00
int 21h

Он вылетает при "input db", говоря "неверный аргумент".Если я изменю его на «input db» «», то произойдет сбой при «mov input, al», требующем «недопустимых операндов».Я изменил его на следующее, и теперь оно работает.

start:
mov ah,08
int 21h
mov [input],al

output:
mov [leftbr], "("
mov [rightbr], ")"
mov dl,[leftbr]
mov ah,02
int 21h
mov dl,[input]
int 21h
mov dl,[rightbr]
int 21h

exit:
mov ah,4ch
mov al,00
int 21h

leftbr db 0
rightbr db 0
input db 0

1 Ответ

2 голосов
/ 05 января 2011

Строка mov input, al пытается переместить все в значение, определенное строкой input db 0, например, компилятор переводит его в mov 0, al.То, что вы хотите сделать, это переместить al в position «input», так что я думаю (кодирование ASM было для меня некоторое время назад) mov [input], al или mov byte ptr:[input], al будет работать лучше.

Редактировать: это то, что отображает "(а)" для меня.Запуск CrunchBang Linux / Wine / FASM для Windows.

format MZ
org 0x100

jmp start
leftbr db "(", 0
rightbr db ")"
input db "a"

start:
xor ax,ax
mov ah,08
;int 21h ; commenting this line because wine doesn't seem to like it
;mov [input],al

output:
mov dl,byte [leftbr]
mov ah,02
int 21h
mov ah,02 ; not sure if ah gets modified, probably not
mov dl,[input]
int 21h
mov ah,02
mov dl,[rightbr]
int 21h

exit:
mov ah,4ch
mov al,00
int 21h 
...