Язык ассемблера, базовый указатель

я читал пример на ассемблере, и у меня есть небольшие сомнения. Мы использовали ассемблер только в наших программах, но последний модуль в семестре - это объединить его с turbo c (поточный ассемблер), и, читая код, есть часть, которую я не совсем понимаю: вот сборка часть:

dosseg
.model small 
.code 
public _myputchar 
_myputchar PROC
    push bp 
    mov bp,sp
    mov dl,[bp+4]
    mov ah,2
    int 21h 
    pop bp 
    ret 
_myputchar ENDP
END

И вот часть C:

#include<stdio.h>
extern void myputchar( char x );
char *str={"Hola Mundo\n"};
void main ( void )
{
    while(*str)
    myputchar(*str++);
    getchar();
}

Итак, все довольно просто, и программа работает, но чего я не понимаю, так это ассемблерного кода. Проблема в том, почему базовый указатель (bp) указывает на +4? (mov dl,[bp+4]), я бы подумал, что вам нужно было только mov dl,bp, но я не понимаю, почему +4. Если кто-то может нам помочь, мы будем очень признательны! (в разделе включения я поставил "" Потому что инструменты форматирования дают мне такую ​​головную боль -_-!


person Hector Mendoza Jacobo    schedule 04.06.2013    source источник


Ответы (2)


Аргумент (x) помещается в стек перед вызовом функции. После этого инструкция call поместит в стек адрес возврата (в данном случае 2 байта), а push bp в начале функции поместит в стек еще 2 байта.

Итак, к настоящему моменту вы поместили в стек еще 2+2 == 4 байта после аргумента. Поскольку стек растет вниз, это означает, что для получения аргумента необходимо сместить указатель на +4 байта.

person Michael    schedule 04.06.2013
comment
Ну гы спасибо! Я был уверен, что это было что-то очень простое, но я не понял! Большое спасибо! - person Hector Mendoza Jacobo; 05.06.2013

Начальный адрес строки, которую вы хотите напечатать, находится в [bp + 4]. Текущий указатель стека — [bp]. Помните, стек растет вниз.

person red-E    schedule 04.06.2013