Я пытаюсь скомпилировать код на ассемблере и C, используя ld86. При этом я сталкиваюсь с проблемой: «Неопределенный символ: автозапуск»
Я уже искал это, и наткнулся на этот вопрос переполнения стека, который в точности похож на мой. Но их решение удалить аргументы из основной функции не сработало для меня. Я ищу еще несколько потенциальных вариантов.
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");
А для bs.s:
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