LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 882|回复: 5

c嵌入的asm如何调用子程序?

[复制链接]
发表于 2004-3-30 21:39:16 | 显示全部楼层 |阅读模式
#include <stdio.h>



int   show(void)
{
    asm   mov    dh,0;          /*光标开始行*/
    asm   mov    dl,0;          /*光标开始列*/
background_black:
    asm   mov    ah,02h;        /*调用2号功能:置光标位置*/
    asm   int    10h;
    asm   mov    bl,11100000b;  /*设置颜色*/
    asm   mov    cx,12;         /*(增加的)横向长度*/
    asm   mov    ah,09h;        /*调用9号功能:在光标位置显示字符和属性*/
    asm   mov    al,' ';        /*显示空白字符*/
    asm   mov    bh,0;          /*0页*/
    asm   int    10h;
    asm   inc    dh;            /*行数加1*/
    asm   cmp    dh,1;          /*行数是否到了第一行?*/
    asm   jnz    background_black;
    /*不是就转移到background_black*/
    asm   jmp    showexit;      /*是就退出*/
showexit:
    return 0;
}

int main(void)
{
    show();
    printf("hello,world!\n");
    getch();
    return 0;
}




上面的代码编译成功,但我想把

asm   mov    ah,02h;     
    asm   int    10h;

作为一个子程序,

作为代替.

原有地方改为:

call     子程序

如何实现?
 楼主| 发表于 2004-3-30 21:40:07 | 显示全部楼层
不好意思.问了一个windows问题
发表于 2004-3-30 22:00:42 | 显示全部楼层
调用子程序就是把参数压入堆栈后,执行call指令。用汇编写完全可以实现。
我明天试试给你写个例子出来。
 楼主| 发表于 2004-3-30 22:05:21 | 显示全部楼层
谢谢版主了.
发表于 2004-3-31 10:20:41 | 显示全部楼层
关键的问题是调用的约定,主要是参数是如何传送的, 参数是由调用方清除还是函数清除. 建议用C语言写一段调用该函数的代码,然后看看它的汇编代码,这样可以减少错误.
发表于 2004-4-1 09:34:47 | 显示全部楼层
这两天闹病毒,我已经所windows给删掉了,无法进行程序调试。不过我想这么做应该是可以的:
先做一个子函数:
sub:
asm push bp;
asm mov bp, sp;
asm mov ah,02h; /*调用2号功能:置光标位置*/
asm int 10h;
asm pop bp;
asm ret;
其中sub为子函数的标号。然后再原来的地方调用它。所以我想修改后的代码应该是这个样子:

  1. int show(void)
  2. {

  3. asm mov dh,0; /*光标开始行*/
  4. asm mov dl,0; /*光标开始列*/
  5. background_black:
  6. asm call sub;
  7. asm mov bl,11100000b; /*设置颜色*/
  8. asm mov cx,12; /*(增加的)横向长度*/
  9. asm mov ah,09h; /*调用9号功能:在光标位置显示字符和属性*/
  10. asm mov al,' '; /*显示空白字符*/
  11. asm mov bh,0; /*0页*/
  12. asm int 10h;
  13. asm inc dh; /*行数加1*/
  14. asm cmp dh,1; /*行数是否到了第一行?*/
  15. asm jnz background_black;
  16. /*不是就转移到background_black*/
  17. asm jmp showexit; /*是就退出*/
  18. showexit:
  19. return 0;

  20. sub:
  21. asm push bp;
  22. asm mov bp, sp;
  23. asm mov ah,02h; /*调用2号功能:置光标位置*/
  24. asm int 10h;
  25. asm pop bp;
  26. asm ret;
  27. }
复制代码

由于我没法调试,这段程序运行肯定会有问题,但是写子函数的方法应该就是这样了。有什么问题自己再修改一下吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表