我正在阅读汇编语言中的一个例子,我有点怀疑。我们只在我们的程序中使用汇编,但是学期的最后一个单元是将它与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。如果有人可以帮助我们,那真是太过分了! (在包含部分,我把“”因为它给我提供了这样的结构工具-_-!
答案 0 :(得分:0)
在调用函数之前,参数(x
)被压入堆栈。在此之后,call
指令将返回地址(在这种情况下为2个字节)压入堆栈,函数开头的push bp
将另外2个字节压入堆栈。
所以现在你已经在参数后将2 + 2 == 4个字节推到了堆栈上。由于堆栈向下增长意味着要获取参数,您必须将指针偏移+4个字节。
答案 1 :(得分:0)
您要打印的字符串的起始地址为[bp + 4]。当前堆栈指针是[bp]。请记住,堆栈会逐渐减少。