Все S1.geti, S2.geti вызывают одну и ту же процедуру (назовите ее Sc_geti). S1.i недоступен. Странные символы

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 ... (много "странных символов")

Он использует es:bx, установленный вызывающим абонентом. Также вы забыли прочитать ввод с клавиатуры до cmp al,13. Тем не менее, это не должно приводить к бесконечному циклу (который вы получите, если я правильно вас понял). Научитесь использовать отладчик, чтобы код можно было пошагово выполнять. PS: почему у вас Sc_geti в dseg?

Jester 08.08.2018 13:11

Я думаю, что это проблема с _THIS equ es: [bx], я меняю на: call Sc_geti, и программа успешно работает.

supermario 08.08.2018 13:44

Хм ... когда я поместил Sc_geti в cseg, я получил ошибку: A2017 Forward reference illegal в этой строке geti dd Sc_geti

supermario 08.08.2018 14:00

Поместите весь сегмент данных после кода. Также вы должны иметь возможность переключаться между сегментами, если вам это больше нравится. Я считаю маловероятным, что замена _THIS заставит его работать, на самом деле он даже не должен собираться тогда, потому что mov ax, _THIS.i не будет действительным. Обратите внимание, что LOOP использует CX в качестве счетчика, вам просто нужен JMP. Итак, что именно происходит с последним кодом в вопросе?

Jester 08.08.2018 14:31

Когда я поместил весь сегмент данных после кода, я получил серьезную ошибку: Symbol not defined

supermario 08.08.2018 14:53

Теперь S1.geti работает правильно, но _THIS.i недоступен. У меня странные символы. Более того, я не получал сообщений из основной программы.

supermario 08.08.2018 15:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
34
0

Другие вопросы по теме