2016-09-16 1 views
0

이것은 대학 과제이므로 emu8086을 사용해야합니다.매크로 내 오프셋 차이 또는 상수 전달

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 

겠어요 - : 없음 emu8086.inc으로

이의 내가 그런

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

있다고 가정 해 봅시다 한 단어에 할당 된 길이를 전달하는 것 외에는 어떤 식 으로든 매크로 내부에서 문자열의 길이를 전달할 수 없습니다. 하지만 나는 상수와 함께 할 수 있다면 흥미 롭습니다.

+1

'mov ax, msglen2'는'db'에서 단어를로드합니다. 이후 바이트가 0이되기 때문에 작동합니다. 당신이 옳다는 것이 맞습니다. 그리고 길이가 메모리에 저장되고로드되지 않고 즉각적인 상수가되도록 정렬해야합니다. –

답변

3

사용 =equ 대신 EQUATE를 정의합니다.

equ의 값은 사용자의 경우에 $msglen1mov ax, msgLen1 명령어의 주소에 의해 대체되는 것을 의미 사용 지점에서 evaulated 동일시된다.

=의 값은 당신이이 경우에 원하는 값을 제공해야 정의의 시점에서 evaulated한다 동일시.

+0

놀랍게도 충분히 효과가 없었습니다. 어쨌든 매크로에 전달되면 0을줍니다. 나는 집에 돌아가서 다시 확인하겠습니다. 매크로 정의 자체에 문제가있을 수 있습니까? 나는 당신이 '라는 이름의 equ''msglen1' 및 매크로 매개 변수'라는 이름의 msglen1' 한 예를 들어, 당신이 (전역 심볼 이름을 그림자 매크로 매개 변수 이름을 사용하지 않는 것 인 경우에 – iwat0qs

+0

음, 우선 내가 해보고 싶었어요 - 당신이 경우 당신의 매크로 안에'mov ax, msglen1'을 쓰고, 어셈블러가 사용해야하는'msglen1' 중 무엇입니까?). – Michael

+0

내가 말했듯이, 예를 들어 여기서만이 작업이 수행되었습니다. 실제 코드에는 그림자가 없습니다. 가장 짧은 코드는'var' 매개 변수와'mov ax, var' 매개 변수가있는 한 줄 매크로였습니다. An ='testvar'가 전달되고 ax는 여전히 0과 같습니다. 매크로 밖에서'mov ax, testvar'를하면 올바른 값을 얻습니다. – iwat0qs