Я действительно не понимаю, как работают указатели стека и указатели байтов. Вот фрагмент кода, на который ссылается проблема:
.data
v1 db 'AB'
v2 db 'CD'
v3 db 'EF
.code
start:
mov ax,@data
mov ds,ax
mov sp,0100h
;call the subroutine
mov ax,offset v1
push ax
mov ax,offset v2
push ax
call subr
retsub:
Подпрограмма:
subr:
push bp
mov bp,sp
mov si,[bp+6]
add si,1
mov dl,[si]
mov ah,2
int 21h
pop bp
ret
На три контрольных вопроса, связанных с этой проблемой, есть ответы:
1. После mov bp,sp
в подпрограмме значение шестнадцатеричного значения в bp
равно 00F8
.
2. Подпрограмма записывает один символ ASCII в стандартный вывод. Пишет B
.
3. Шестнадцатеричное значение в регистре sp
после возврата подпрограммы в основную программу по инструкции на метке retsub
равно 00FC
.
Может кто-нибудь провести меня через шаги, чтобы я мог немного лучше понять этот процесс?
Таблица данных смещения, которую я имею:
offset 00 01 02 03 04 05
data 41 42 43 44 45 46
В моей голове я подхожу к этой проблеме:
mov sp,0100h ;sp = 0100
mov ax,offset v1 ;ax = 4142
push ax ;4142 is pushed onto the stack
mov ax,offset v2 ;ax = 4344
push ax ;4344 is pushed onto the stack
call subr
stack
------
|4344|
------
|4142|
------
Это насколько я понимаю, и я уверен, что я даже не делаю эту часть правильно. Если вы можете, пожалуйста, разберитесь с тем, что такое bp и sp с каждым шагом, чтобы я мог следовать и, надеюсь, применить это к другой проблеме обзора.