2016-09-16 2 views
0

Это университетское задание, поэтому необходимо использовать emu8086. При отсутствии emu8086.incПеремещение смещения или константы внутри макроса

Скажем, у меня есть

msg db "Hello" 
msgend: 
msglen1 equ $ - msg 
msglen2 db $ - msg 

Тогда:

mov ax, msgend - offset msg ; ax gets the correct length 
mov ax, msglen1    ; correct length 
mov ax, msglen2    ; correct length 

; same names as offsets to make it clear, 
; how which parameters would be passed. 
; But not the same in real code. 
TESTMACRO macro msg msgend msglen1 msglen2 
    mov ax, msg ; correct offset 
    mov ax, msgend ; correct offset 
    mov ax, msgend - offset msg ; zero length 
    mov ax, msglen1    ; again zero length 
    mov ax, msglen2    ; correct length, but it used up a word 
endm 

Зв Я не могу передать длину строки внутри макроса каким-либо образом, за исключением пропуска длины, выделенной словом. Но мне интересно, если я могу сделать это с постоянной константы.

+1

'mov ax, msglen2' загружает слово из' db'. Он работает только потому, что байт после этого равен нулю. Вы правы, что это плохо, и вы должны организовать, чтобы длина была постоянной константой, не хранилась в памяти и не загружалась. –

ответ

3

Используйте =, чтобы определить свой equate вместо equ.

Ценность equ приравнивают является evaulated в точке использования, что в вашем случае это означает, что $ в msglen1 заменяется на адрес mov ax, msgLen1 инструкции.

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

+0

Удивительно, но это тоже не сработало. Дает ноль в любом случае при передаче макросу. Я вернусь домой и проверю его снова. Может быть, что-то не так с самим макроопределением? – iwat0qs

+0

Ну, первое, что я попробую, если бы вы были, - это не использовать имена параметров макроса, которые теневые глобальные имена символов (например, у вас есть 'equ' с именем' msglen1' и параметр макроса с именем 'msglen1' - если вы напишите 'mov ax, msglen1' внутри вашего макроса, какой из этих' msglen1' должен использовать ассемблер?). – Michael

+0

Как я уже сказал, это было сделано только ради ради примера. У меня нет тени в реальном коде. Самый короткий код - это однострочный макрос с параметром 'var' и' mov ax, var'. An = equate 'testvar' передается, а ax все равно равен 0. Если я делаю' mov ax, testvar' вне любого макроса, он получает правильное значение – iwat0qs

Смежные вопросы