将.org指令与.data节中的数据一起使用:与ld有关 [英] Using .org directive with data in .data section: In connection with ld
问题描述
在努力了解如何使用GNU binutils使用以下命令构建简单的引导加载程序的过程中 gas 我遇到了一个问题,怎么办您告诉链接器将数据放置在使用.org扩展位置计数器的文件中,同时将文件大小保持为512字节的位置.我似乎找不到办法.
In my efforts to understand how to use the GNU binutils to build a simple boot loader using gas I have come across the question, how do you tell the linker where to put your data, in a file that uses .org to advance the location counter while keeping the file size at 512 bytes. I can't seem to find a way to do this.
尝试执行此操作的汇编程序是:
The assembly program that tries to do this is:
# Author: Matthew Hoggan
# Date Created: Tuesday, Mar 6, 2012
.code16 # Tell assembler to work in 16 bit mode
.section .data
msg: # Message to be printed to the screen
.asciz "hello, world"
.section .text
.globl _start # Help linker find start of program
_start:
xor %ax, %ax # Zero out ax register (ah used to specify bios function to Video Services)
movw %ax, %ds # Since ax is 0x00 0x00 use it to set data segment to 0
mov $msg, %si # Use source index as pointer to string
loop:
movb %ds:(%si), %al # Pass data to BIOS function in low nibble of ax
inc %si # Advance the pointer
or %al, %al # If byte stored in al is equal to zero then...
jz _hang # Zero signifies end of string
call print_char # Print current char in al
jmp loop # Repeat
#
# Function that uses bios function calls
# to print char to screen
#
print_char:
movb $0x0e, %ah # Function to print a character to the screen
movb $0x07, %bl # color/style to use for the character
int $0x10 # Video Service Request to Bios
ret
#
# Function used as infinite loop
#
_hang:
jmp _hang
.org 510
.byte 0x55, 0xAA
.end
更新 使用以下命令,我得到以下错误:
UPDATE Using the following commands I get the following error:
mehoggan@mehoggan-laptop:~/Code/svn_scripts/assembly/bootloader/gas$ ld --oformat binary -o string string.o
string.o: In function `_start':
(.text+0x5): relocation truncated to fit: R_X86_64_16 against `.data'
推荐答案
For this kind of work you should write your own linker script. Just pass it to the linker with the -T
option.
我遇到的几乎相同问题的脚本是:
My script for an almost identical problem was:
SECTIONS
{
. = 0x1000;
bootsec :
{
*(.text)
*(.data)
*(.rodata)
*(.bss)
endbootsec = .;
. = 0x1FE;
SHORT(0xAA55)
}
endbootsecw = endbootsec / 2;
image = 0x1200;
}
有了这个技巧,您不必将0x55 0xAA
放到汇编器中!
With that trick you don't event need to put the 0x55 0xAA
in the assembler!
开头的0x1000
:实际上所有跳转都是相对的,因此没有使用,但是稍后需要将其跳转到保护模式...
The 0x1000
at the beginning: Actually all the jumps are relative, so that is not used, but it is needed later for the jump into protected mode...
endbootsecw
,endbootsec
和image
是代码中其他位置使用的符号.
endbootsecw
, endbootsec
and image
are symbols used elsewhere in the code.
这篇关于将.org指令与.data节中的数据一起使用:与ld有关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!