忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT 视频 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 11734 | 回复: 14

[貌似已解决]gcc编译汇编和c的函数调用的问题 [复制链接]

论坛徽章:
0
发表于 2009-02-17 13:23 |显示全部楼层
感谢大家热情的回复,我后来自己好好想了想,然后翻了翻资料,和同学讨论了下,貌似找到了问题的根源。
main.o的.text被ld贴到了512字节后面,但bios只会将第一个扇区读入内存,所以后面的压根就没有读入,自然一call就挂了。
不知道,我这样理解有没有错。

本来是想在写bootsector的时候就用C,看来还是不能偷懒阿,只有在loader再开始了。

我写了一个引导扇区的程序,想在其中调用用c写的函数,但是发现,一旦在汇编中调用了C的函数之后,系统就卡在那里不往下执行了,请问这怎么解决阿。
我是新手,还望大家多多帮忙阿。
boot.S:
#define MSG(x) leaw x,%si;call display

.code16
.section .text
.globl _start
_start:
    movw $0x2000,%sp
    movw %sp,%bp


    #set video mode
    movw $0x0003,%ax
    int $0x10
    
    MSG(sector_msg1)
    call main
    MSG(sector_msg2)
    
    
    _endless_loop:jmp _endless_loop

sector_msg1:
    .asciz "bootsector: looking for a loader... "
sector_msg2:
    .asciz "found\n\r"

.globl test
test:
    MSG(sector_msg2)
    ret

display:
    cld
    movb $0xe,%ah    /* use BIOS interrupt 10,e */
    movb $0xf,%bl    /* font color */
    display_start:
    lodsb
    orb %al,%al
    jz display_end
    int $0x10
    jmp display_start
    display_end:
    ret


.org 510
.word 0xaa55


main.c
extern void test();
void main()
{
    test();
    return;
}

链接脚本boot.ld:
OUTPUT_FORMAT("binary")
ENTRY(_start)
SECTIONS
{
    .text 0x7c00:
    {
        *(.text)
    }
}

Makefile:
CC=gcc
LD=ld
AS=as
LDSCRIPT=carrot.ld
DEBUG_DIR=./
INCLUDE_DIR=../include/

all:boot.img

boot.img:boot.bin
    dd if=/dev/zero of=$(DEBUG_DIR)emptydisk.img bs=512 count=2880
    dd if=boot.bin of=$(DEBUG_DIR)boot.img bs=512 count=1
    dd if=$(DEBUG_DIR)emptydisk.img of=$(DEBUG_DIR)boot.img skip=1 seek=1 bs=512 count=2879
boot.bin:boot.o
    $(LD) -Tboot.ld boot.o main.o -o boot.bin
boot.o:boot.S
    $(CC) -c -I$(INCLUDE_DIR) -o boot.o boot.S
    $(CC) -c -I$(INCLUDE_DIR) -o main.o main.c

clean:
    rm -rf *.bin *.o $(INCLUDE_DIR)/boot.img


[ 本帖最后由 破碎细胞 于 2009-2-19 17:18 编辑 ]

论坛徽章:
2
2015亚冠之莱赫维亚
日期:2015-09-14 11:19:42操作系统版块每日发帖之星
日期:2015-11-05 06:20:00
发表于 2009-02-17 14:01 |显示全部楼层
好想没看到指定SP 是不这问题

论坛徽章:
0
发表于 2009-02-17 17:50 |显示全部楼层
原帖由 lixinwei1985@si 于 2009-2-17 14:01 发表
好想没看到指定SP 是不这问题

加上了这个
movw $0x2000,%sp
movw %sp,%bp
还是这个样子

论坛徽章:
0
发表于 2009-02-17 18:31 |显示全部楼层
这可能是常识的问题,是你没有注意,一个程序应该只有一个main函数!你这里C函数是用main!

论坛徽章:
0
发表于 2009-02-17 18:43 |显示全部楼层
原帖由 破碎细胞 于 2009-2-17 13:23 发表
我写了一个引导扇区的程序,想在其中调用用c写的函数,但是发现,一旦在汇编中调用了C的函数之后,系统就卡在那里不往下执行了,请问这怎么解决阿。
我是新手,还望大家多多帮忙阿。
boot.S:
#define MSG(x) ...

没看你的代码,因为你的概念就是错的。
当你执行“引导扇区的程序”时,内存里就只有ROM-BIOS和这个引导记录代码,C库函数代码还没有进来,你没法调用。

论坛徽章:
0
发表于 2009-02-17 18:45 |显示全部楼层

回复 #4 cwqing1973 的帖子

貌似不是这个问题,改成cmain结果是一样的。

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
发表于 2009-02-19 10:02 |显示全部楼层
你用你的MSG宏插到main函数里去跟踪看看

论坛徽章:
0
发表于 2009-02-19 16:51 |显示全部楼层
原帖由 beepbug 于 2009-2-17 18:43 发表

没看你的代码,因为你的概念就是错的。
当你执行“引导扇区的程序”时,内存里就只有ROM-BIOS和这个引导记录代码,C库函数代码还没有进来,你没法调用。

并没有调用C的库函数。
我的目的仅仅是想用C来写一部分代码,这样轻松一点。
还是看了代码再说比较好一点。

论坛徽章:
0
发表于 2009-02-19 17:11 |显示全部楼层
原帖由 cjaizss 于 2009-2-19 10:02 发表
你用你的MSG宏插到main函数里去跟踪看看

我貌似大概知道什么问题了。
C的.text被贴到了512字节后面,而bios开始只读取引导扇区,也就是512个字节,后面的压根就读如内存,所以一call就挂了。不知道这样解释有没有道理。
其实,我的初衷是想在bootsector开始就用c来写部分代码,现在看来只有在loader开始了。

论坛徽章:
0
发表于 2009-02-19 17:16 |显示全部楼层
Mark 一下,哈哈。不能偷懒哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP