0

我正在阅读汇编语言中的一个例子,我有点怀疑。我们只在我们的程序中使用汇编,但本学期的最后一个单元是将它与 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();
}

所以,这很简单,程序可以工作,但是,我不明白的是,它是汇编代码。问题是,为什么它指向 +4 的基指针 (bp)?(mov dl,[bp+4]),我认为你只需要 mov dl,bp 但我不明白为什么 +4。如果有人可以帮助我们,那将是非常感激的!(在包含部分我放了“”,因为它给了我这样的格式化工具-_-!

4

2 回答 2

0

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

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

于 2013-06-04T20:47:41.403 回答
0

您要打印的字符串的起始地址是 [bp + 4]。当前堆栈指针为 [bp]。请记住,堆栈会向下增长。

于 2013-06-04T20:51:43.363 回答