(1)a.c : 在屏幕中间显示一个绿色字母小a
void showchar(char a,int b);
main()
{
showchar('a',2);
}
void showchar(char a,int b)
{
*(char far *)(0xb8000000+160*10+80) = a;
*(char far *)(0xb8000000+160*10+81) = b;
}
参数 通过 栈 来传递,
showchar('a',2);
,第二个参数 b首先被压入栈,第一个参数 a随后被压入栈,弹出来的时候,顺序正好相反,弹出来后被放到寄存器AL里面;CPU 读取完一条指令后,IP值 会先自动增加,然后再执行刚刚读取的那条指令;
-
CALL 调用子程序时,会将当前的IP或者CS、IP压入栈,这里的IP值刚好就是
0207H
,低位07
放到低地址
,高位02
放到高地址
,所以在图片里看上去是从左到右是07 02
,因为图片里是从低地址到高地址
;
(2)b.c 在屏幕中间依次显示绿色字符'a~h'
void showchar(int,int,...);
main()
{
showchar(8,2,'a','b','c','d','e','f','g','h');
}
void showchar(int n,int color,...)
{
int a;
for(a=0;a!=n;a++)
{
*(char far *)(0xb8000000 + 160*10 + 80 + a + a) = *(int *)(_BP+8+a+a);
*(char far *)(0xb8000000 + 160*10 + 81 + a + a) = color;
}
}
-
参数个数一并压入栈用
[BP+04]
进行访问,使用SI寄存器
记录当前循环次数,与参数个数进行对比;
- 存疑,U命令查看过程中遇到了一个叫做
GWD
的汇编指令,这是什么?
CWD是 汇编语言中的字扩展指令,它的功能是将一个字型变量扩展为双字型变量。高位在DX,低位在AX。
https://blog.csdn.net/dujiahei/article/details/46419955