汇编语言,基指针

时间:2013-06-04 20:29:33

标签: pointers assembly turbo-c

我正在阅读汇编语言中的一个例子,我有点怀疑。我们只在我们的程序中使用汇编,但是学期的最后一个单元是将它与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]),我认为你只需要移动dl,bp,但我不明白为什么+4。如果有人可以帮助我们,那真是太过分了! (在包含部分,我把“”因为它给我提供了这样的结构工具-_-!

2 个答案:

答案 0 :(得分:0)

在调用函数之前,参数(x)被压入堆栈。在此之后,call指令将返回地址(在这种情况下为2个字节)压入堆栈,函数开头的push bp将另外2个字节压入堆栈。

所以现在你已经在参数后将2 + 2 == 4个字节推到了堆栈上。由于堆栈向下增长意味着要获取参数,您必须将指针偏移+4个字节。

答案 1 :(得分:0)

您要打印的字符串的起始地址为[bp + 4]。当前堆栈指针是[bp]。请记住,堆栈会逐渐减少。