1
[section .data]
strHello db "Hello World"
STRLEN equ $-strHello
MessageLength equ 9
Message db "hi!!!!   "


[section .text]
global main
main:
mov edx,STRLEN;
mov ecx,strHello;
mov ebx,1
mov eax,4
int 0x80


call DispStr


mov ebx,0   
mov eax,1   
int 0x80    


DispStr:      
  mov ax,MessageLength
  mov dh,0
  mul dh
  add ax,Message
  mov bp,ax 
  mov ax,ds
  mov es,ax 
  mov cx,MessageLength
  mov ax,01301h 
  mov bx,0007h
  mov dl,0
  int 10h
  ret 

コンパイルして実行します。

$ nasm -f elf64 helloworld.asm -o helloworld.o
$ gcc -s -o helloworld helloworld.o
helloworld.o: In function `DispStr':
helloworld.asm:(.text+0x31): relocation truncated to fit: R_X86_64_16 against `.data'
collect2: ld return 1
4

2 に答える 2

1

この正確なエラーは、次の理由で発生します。

add ax,Message

axは 16 ビット幅のみですMessageが、64 ビット幅のアドレスであるため、再配置中に収まりません。

このエラーについては、https ://stackoverflow.com/a/32639540/895245 で詳しく説明しています。

この場合の解決策は、リンカー スクリプトを使用することです

このリポジトリには、ブート セクタと BIOS の実例が含まれています: https://github.com/cirosantilli/x86-bare-metal-examples/tree/d217b180be4220a0b4a453f31275d38e697a99e0

于 2015-09-17T20:57:45.157 に答える
0

int 10h64 ビット モードであるため、BIOS 機能 (命令など)を使用することはできません。できたとしても、BIOS は別のアドレス指定メカニズムを使用するため、のアドレスを使用しようとしてMessageも機能しません。

また、DispStr関数の最初の 3 行はゼロになりませaxんか? dh(ゼロに設定された を掛けているため)

于 2013-06-27T14:27:43.847 に答える