2016-12-04 23 views
-2

У меня есть назначение сделать цифровые часы, и для этого требуются номера печати от 0 до 9, аналогичные номерам на семисегментном дисплее. До сих пор я делал номера без макросов. Теперь я пытаюсь сделать горизонтальную линию, используя одну, и я получаю следующую ошибку.Ошибка A2149 при создании строки с использованием макросов на языке ассемблера

enter image description here

код выглядит следующим образом:

Include irvine32.inc 

draw_row macro row_start, row_end, col_ 
movzx al, row_start 
mov bl, col_ 
mov ecx, row_end 

L1: 
mov dl,al ;column 
mov dh,bl ;row 
call Gotoxy 
mov edx, offset string1 
call writestring 

inc al 
loop L1 
endm 

;draw_column macro _row, _col 

;endm 

.data 
temp_col1 byte ? 
temp_col2 byte ? 
temp_row1 byte ? 
temp_row2 byte ? 


string1 byte "_" , 0 
string2 byte "|" , 0 
.code 
main proc 

mov temp_row1, 0 
mov temp_row2, 5 
mov temp_col1, 0 
draw_row temp_row1, temp_row2 , temp_col1 

call crlf 

call dumpregs 

;call clrscr 

exit 
main endp 
end main   ;end program` 

Этот код должен напечатать ----- Пожалуйста, помогите с ошибками. Я новичок в макросах.

ответ

1

Вы должны прочитать error documentation, который говорит

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

Это относится к movzx al, row_start. Вы не можете нулевое расширение в байтовый регистр. Вам просто нужен mov.

Другая ошибка обратная, вы использовали mov ecx, row_end, где row_end является байтом, поэтому вам нужен movzx.

PS: Ни один из них не относится к макросам, и на самом деле я не вижу причины кодировать это как макрос.

+0

Мы должны использовать макросы. Я был в порядке без них. Спасибо. Оно работает. –