Я новичок в сборке и пытаюсь скомпилировать файл asm, сгенерированный из файла c ++, следуя этому руководству Как сгенерировать ассемблируемый в nasm код сборки из c исходного кода на Linux?,
Код c ++:
#include <iostream>
int main () {
std::cout << "Hello World!";
return 0;
}
После устранения некоторых ошибок, следующих за руководством, у меня осталось "hw.asm: 8: error: попытка объявить локальный символ` .refptr ._ZSt4cout 'как глобальный. " Я попытался удалить глобальный ярлык для значения и переместить его в раздел .text или section .data, но ни один из них не сработал. Asm
; Disassembly of file: hw.o
; Tue Jan 14 19:14:41 2020
; Mode: 64 bits
; Syntax: YASM/NASM
; Instruction set: Pentium Pro, x64
global main
global .refptr._ZSt4cout
extern _ZSt4cout ; byte
extern atexit ; near
extern _ZNSt8ios_base4InitC1Ev ; near
extern _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc ; near
extern _ZNSt8ios_base4InitD1Ev ; near
extern __main ; near
SECTION .text ; section number 1, code
__tcf_0:lea rcx, [rel _ZStL8__ioinit] ; 0000 _ 48: 8D. 0D, 00000000(rel)
jmp _ZNSt8ios_base4InitD1Ev ; 0007 _ E9, 00000000(rel)
nop ; 000C _ 90
nop ; 000D _ 90
nop ; 000E _ 90
nop ; 000F _ 90
SECTION .data ; section number 2, data
SECTION .bss ; section number 3, bss
_ZStL8__ioinit: ; byte
resb 16 ; 0000
SECTION .rdata ; section number 4, const
?_001: ; byte
db 48H, 65H, 6CH, 6CH, 6FH, 20H, 77H, 6FH ; 0000 _ Hello wo
db 72H, 6CH, 64H, 21H, 00H, 00H, 00H, 00H ; 0008 _ rld!....
SECTION .text.startup ; section number 5, code
.text.startup:; Local function
.refptr._ZSt4cout
main:
sub rsp, 40 ; 0000 _ 48: 83. EC, 28
call __main ; 0004 _ E8, 00000000(rel)
mov rcx, qword [rel .refptr._ZSt4cout] ; 0009 _ 48: 8B. 0D, 00000000(rel)
lea rdx, [rel ?_001] ; 0010 _ 48: 8D. 15, 00000000(rel)
call _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc; 0017 _ E8, 00000000(rel)
xor eax, eax ; 001C _ 31. C0
add rsp, 40 ; 001E _ 48: 83. C4, 28
ret ; 0022 _ C3
; Filling space: 0DH
; Filler type: Multi-byte NOP
; db 0FH, 1FH, 00H, 66H, 2EH, 0FH, 1FH, 84H
; db 00H, 00H, 00H, 00H, 00H
ALIGN 16
_GLOBAL__sub_I_main:; Local function
lea rcx, [rel _ZStL8__ioinit] ; 0030 _ 48: 8D. 0D, 00000000(rel)
sub rsp, 40 ; 0037 _ 48: 83. EC, 28
call _ZNSt8ios_base4InitC1Ev ; 003B _ E8, 00000000(rel)
lea rcx, [rel __tcf_0] ; 0040 _ 48: 8D. 0D, 00000000(rel)
add rsp, 40 ; 0047 _ 48: 83. C4, 28
jmp atexit ; 004B _ E9, 00000000(rel)
SECTION .ctors ; section number 6, data
dq _GLOBAL__sub_I_main ; 0000 _ 0000000000000030 (d)
SECTION .rdata$zzz ; section number 7, const
db 47H, 43H, 43H, 3AH, 20H, 28H, 78H, 38H ; 0000 _ GCC: (x8
db 36H, 5FH, 36H, 34H, 2DH, 70H, 6FH, 73H ; 0008 _ 6_64-pos
db 69H, 78H, 2DH, 73H, 65H, 68H, 2DH, 72H ; 0010 _ ix-seh-r
db 65H, 76H, 31H, 2CH, 20H, 42H, 75H, 69H ; 0018 _ ev1, Bui
db 6CH, 74H, 20H, 62H, 79H, 20H, 4DH, 69H ; 0020 _ lt by Mi
db 6EH, 47H, 57H, 2DH, 57H, 36H, 34H, 20H ; 0028 _ nGW-W64
db 70H, 72H, 6FH, 6AH, 65H, 63H, 74H, 29H ; 0030 _ project)
db 20H, 36H, 2EH, 33H, 2EH, 30H, 00H, 00H ; 0038 _ 6.3.0..
SECTION .rdata$.refptr._ZSt4cout ; section number 8, const
; Communal section not supported by YASM
.refptr._ZSt4cout: ; qword
dq _ZSt4cout ; 0000 _ 0000000000000000 (d)
dq 0000000000000000H ; 0008 _ 0000000000000000
Я понимаю, что говорит ошибка, но не совсем уверен, как ее исправить. У меня не было опыта работы с языком ассемблера, и не повезло найти ответ в Интернете. Буду очень признателен за шаг в правильном направлении.
Также я делаю это на Windows 10, используя mingw и ebe ide.