S1.geti, S2.geti и S3.geti вызывают одну и ту же процедуру (назовите ее Sc_geti). Как Sc_geti различает S1.i, S2.i и S3.i?
Я не могу распечатать S1.geti.
.MODEL SMALL
.DATA
MSG1 DB "Message1:... ",'$'
MSG2 DB "Message2:... ",'$'
MSG3 DB "Message3:... ",'$'
dseg segment byte public 'data'
_THIS equ es:[bx]
Sc_geti proc far
mov ax, _THIS.i
ret
Sc_geti endp
Sc struc
i dw ?
j dw ?
c dd ?
geti dd Sc_geti
Sc ends
S1 Sc <1,1,1,>
S2 Sc <2,'2','2',>
S3 Sc <'3','3','3',>
dseg ends
;
cseg segment byte public 'CODE'
assume cs:cseg, ds:dseg, es:dseg
main:
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG1 ;print msg1
MOV AH,09H
INT 21H
mov bx, seg S1
mov es, bx
mov bx, offset S1
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG1 ;print msg1
MOV AH,09H
INT 21H
call S1.geti
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG3 ;print msg3
MOV AH,09H
INT 21H
CMP AL,13 ;ascii for "ENTER" key
JE EXIT
MOV DL,0AH ;moving the content of AH into dl to print it
MOV AH,02 ;code to print a character
INT 21H
EXIT:
MOV AH,4CH
INT 21H
END
cseg ends
ВЫХОД: Message1:...Message1:...
Я пытаюсь понять этот документ:
http://www.drdobbs.com/embedded-systems/object-orient-programming-in-assembly/184408319 (Пример 10).
.MODEL SMALL
.DATA
MSG1 DB "Message1:... ",'$'
MSG2 DB "Message2:... ",'$'
MSG3 DB "Message3:... ",'$'
MSG4 DB "Message4: INSIDE Sc_geti ",'$'
;
cseg segment byte public 'CODE'
assume cs:cseg, ds:dseg, es:dseg
_THIS equ es:[bx]
Sc_geti proc far
mov ax, _THIS.i
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG4 ;print msg4
MOV AH,09H
INT 21H
MOV DX,_THIS.i ;moving the content
MOV AH,02 ;code to print a character
INT 21H
ret
Sc_geti endp
cseg ends
dseg segment byte public 'data'
Sc struc
i dw ?
j dw ?
c dd ?
geti dd Sc_geti
Sc ends
S1 Sc <'1','1',1,>
S2 Sc <2,'2','2',>
S3 Sc <'3','3','3',>
dseg ends
cseg segment byte public 'CODE'
assume cs:cseg, ds:dseg, es:dseg
main:
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG1 ;print msg1
MOV AH,09H
INT 21H
mov bx, seg S1
mov es, bx
mov bx, offset S1
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG1 ;print msg1
MOV AH,09H
INT 21H
call S1.geti
MOV AX,@DATA
MOV DS,AX
LEA DX,MSG3 ;print msg3
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
END
cseg ends
ВЫВОД: Сообщение4: ВНУТРИ Sc_geti = t v ... (много "странных символов")
Я думаю, что это проблема с _THIS equ es: [bx], я меняю на: call Sc_geti
, и программа успешно работает.
Хм ... когда я поместил Sc_geti в cseg, я получил ошибку: A2017 Forward reference illegal
в этой строке geti dd Sc_geti
Поместите весь сегмент данных после кода. Также вы должны иметь возможность переключаться между сегментами, если вам это больше нравится. Я считаю маловероятным, что замена _THIS
заставит его работать, на самом деле он даже не должен собираться тогда, потому что mov ax, _THIS.i
не будет действительным. Обратите внимание, что LOOP
использует CX
в качестве счетчика, вам просто нужен JMP
. Итак, что именно происходит с последним кодом в вопросе?
Когда я поместил весь сегмент данных после кода, я получил серьезную ошибку: Symbol not defined
Теперь S1.geti работает правильно, но _THIS.i недоступен. У меня странные символы. Более того, я не получал сообщений из основной программы.
Он использует
es:bx
, установленный вызывающим абонентом. Также вы забыли прочитать ввод с клавиатуры доcmp al,13
. Тем не менее, это не должно приводить к бесконечному циклу (который вы получите, если я правильно вас понял). Научитесь использовать отладчик, чтобы код можно было пошагово выполнять. PS: почему у васSc_geti
вdseg
?