gpt4 book ai didi

c - 编译 ld86 时出现问题 : Undefined symbol auto_start

转载 作者:行者123 更新时间:2023-11-30 16:23:09 24 4
gpt4 key购买 nike

我正在尝试使用 ld86 编译一些汇编代码和 C 代码。这样做时,我遇到了一个问题:“ undefined symbol :auto_start”

我已经搜索过这个,并发现了this堆栈溢出问题,和我的一模一样。但是,他们从主函数中删除参数的解决方案对我不起作用。我正在寻找更多潜在的选择。

ld86 -d bs.o t.o /usr/lib/bcc/libc.a
ld86: warning: _gets redefined in file
/usr/lib/bcc/libc_s.a(gets.o); using definition in t.o
undefined symbol: auto_start

我的 t.c 代码:

1 #include <string.h>
2 #include <stdio.h>
3 int prints(char *s)
4 {
5 int i;
6 for(i = 0; i<strlen(s); i++)
7 {
8 putchar(s[i]);
9 }
10 return 0;
11 }
12
13 int gets(char name[])
14 {
15 int i = 0;
16 char c = 0;
17 while(c != '\n')
18 {
19 c = getc(stdin);
20 name[i] = c;
21 i++;
22 }
23 name[i-1] = 0;
24 return 0;
25 }
26
27 int main()
28 {
29 char name[64];
30 prints("Welcome to my Booter!\n");
31 while(1)
32 {
33 memset(name,0,64);
34 prints("What is your name?\n");
35 gets(name);
36 if(name[0] == 0)
37 {
38 break;
39 }
40 prints("Welcome "); prints(name); prints("\n\r");
41 }
42 prints("Return to assembly and hang\n\r");

还有废话:

BOOTSEG =  0x9000        ! Boot block is loaded again to here.
SSP = 8192 ! Stack pointer at SS+8KB

.globl _main,_prints ! IMPORT symbols
.globl _getc,_putc ! EXPORT symbols

.globl _readfd,_setes,_inces,_error

!-------------------------------------------------------
! Only one SECTOR loaded at (0000,7C00). Get entire BLOCK in
!-------------------------------------------------------
mov ax,#BOOTSEG ! set ES to 0x9000
mov es,ax
xor bx,bx ! clear BX = 0

!---------------------------------------------------
! read boot BLOCK to [0x9000,0]
!---------------------------------------------------
xor dx,dx ! drive 0, head 0
xor cx,cx ! cyl 0 sector 0
incb cl ! cyl 0, sector 1
mov ax, #0x0202 ! READ 1 block
int 0x13

jmpi start,BOOTSEG ! CS=BOOTSEG, IP=start

start:
mov ax,cs ! Set segment registers for CPU
mov ds,ax ! we know ES,CS=0x9000. Let DS=CS
mov ss,ax ! SS = CS ===> all point at 0x9000
mov es,ax
mov sp,#SSP ! SP = 8KB above SS=0x9000

mov ax,#0x0012 ! 640x480 color
int 0x10

call _main ! call main() in C

test ax, ax
je _error

jmpi 0,0x1000


!---------------------------------------------
! char getc() function: returns a char
!---------------------------------------------
_getc:
xorb ah,ah ! clear ah
int 0x16 ! call BIOS to get a char in AX
ret

!----------------------------------------------
! void putc(char c) function: print a char
!----------------------------------------------
_putc:
push bp
mov bp,sp

movb al,4[bp] ! get the char into aL
movb ah,#14 ! aH = 14
movb bl,#0x0D ! bL = cyan color
int 0x10 ! call BIOS to display the char

pop bp
ret




!---------------------------------------
! readfd(cyl, head, sector, buf)
! 4 6 8 10
!---------------------------------------
_readfd:
push bp
mov bp,sp ! bp = stack frame pointer

movb dl, #0x00 ! drive 0=FD0
movb dh, 6[bp] ! head
movb cl, 8[bp] ! sector
incb cl ! BIOS count sector from 1
movb ch, 4[bp] ! cyl
mov bx, 10[bp] ! BX=buf ==> memory addr=(ES,BX)
mov ax, #0x0202 ! READ 2 sectors to (EX, BX)

int 0x13 ! call BIOS to read the block
jb _error ! to error if CarryBit is on [read failed]

pop bp
ret


_setes: push bp
mov bp,sp

mov ax,4[bp]
mov es,ax

pop bp
ret

_inces: ! inces() inc ES by 0x40, or 1K
mov ax,es
add ax,#0x40
mov es,ax
ret

!------------------------------
! error & reboot
!------------------------------
_error:
mov bx, #bad
push bx
call _prints

int 0x19 ! reboot

最佳答案

经过多次故障排除后:我发现我需要删除 C 文件顶部的 include 语句,并删除 main 函数中的参数。因此,链接页面部分正确。

关于c - 编译 ld86 时出现问题 : Undefined symbol auto_start,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54115974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com