将C代码转NASM x86汇编时遇?_001未定义错误求助
问题:NASM汇编编译时
?_001符号未定义错误 我最近尝试把一段从标准输入读取数值、处理数组的C代码,转换成NASM x86-64汇编代码。转换后执行编译命令 nasm -f elf64 main.asm 时,出现了两个错误:
main.asm:45: error: symbol `?_001' undefined main.asm:106: error: symbol `?_001' undefined
这个?_001符号在生成的汇编代码里被使用了,但根本没定义。我试着手动删掉这个符号,结果代码没法正常运行。
原C代码
#include <stdio.h> #include <stdlib.h> #define MAX_PHYSICAL_MEMORY 500 static long M[MAX_PHYSICAL_MEMORY] = { }; int main() { for (int i=0; i<MAX_PHYSICAL_MEMORY; i++){//taking the numbers from an array scanf("%ld", &M[i]); } int i = 0; //char *format; while (M[i] || M[i + 1] || M[i + 2]){//this is the sic program if ((M[M[i]] -= M[M[i + 1]]) < 0) i = M[i + 2]; else i += 3; } for (i = 0; i < MAX_PHYSICAL_MEMORY; ++i) {//it is just do the printing printf("%ld ", M[i]); } printf("\n"); return 0; }
生成的NASM代码
; Disassembly of file: main.o ; Tue May 22 11:34:20 2018 ; Mode: 64 bits ; Syntax: YASM/NASM ; Instruction set: Pentium Pro, x64 default rel global main extern putchar ; near extern __printf_chk ; near extern __isoc99_scanf ; near SECTION .text ; section number 1, code SECTION .data ; section number 2, data SECTION .bss ; section number 3, bss M: ; byte resq 500 ; 0000 SECTION .rodata.str1.1 ; section number 4, const ?_002: ; byte db 25H, 6CH, 64H, 00H ; 0000 _ %ld. ?_003: ; byte db 25H, 6CH, 64H, 20H, 00H ; 0004 _ %ld . SECTION .text.unlikely ; section number 5, code SECTION .text.startup ; section number 6, code main: ; Function begin push r12 ; 0000 _ 41: 54 push rbp ; 0002 _ 55 mov r12d, ?_001 ; 0003 _ 41: BC, 00000000(d) push rbx ; 0009 _ 53 mov ebx, M ; 000A _ BB, 00000000(d) mov rbp, rbx ; 000F _ 48: 89. DD ; Filling space: 6H ; Filler type: Multi-byte NOP ; db 66H, 0FH, 1FH, 44H, 00H, 00H ALIGN 8 ?_004: mov rsi, rbp ; 0018 _ 48: 89. EE xor eax, eax ; 001B _ 31. C0 mov edi, ?_002 ; 001D _ BF, 00000000(d) add rbp, 8 ; 0022 _ 48: 83. C5, 08 call __isoc99_scanf ; 0026 _ E8, 00000000(rel) cmp r12, rbp ; 002B _ 49: 39. EC jnz ?_004 ; 002E _ 75, E8 xor eax, eax ; 0030 _ 31. C0 ; Filling space: 6H ; Filler type: Multi-byte NOP ; db 66H, 0FH, 1FH, 44H, 00H, 00H ALIGN 8 ?_005: movsxd rdx, eax ; 0038 _ 48: 63. D0 ; Note: Address is not rip-relative mov rcx, qword [abs M+rdx*8] ; 003B _ 48: 8B. 0C D5, 00000000(d) lea edx, [rax+1H] ; 0043 _ 8D. 50, 01 movsxd rdx, edx ; 0046 _ 48: 63. D2 test rcx, rcx ; 0049 _ 48: 85. C9 ; Note: Address is not rip-relative mov rsi, qword [abs M+rdx*8] ; 004C _ 48: 8B. 34 D5, 00000000(d) jnz ?_006 ; 0054 _ 75, 16 test rsi, rsi ; 0056 _ 48: 85. F6 jnz ?_006 ; 0059 _ 75, 11 lea edx, [rax+2H] ; 005B _ 8D. 50, 02 movsxd rdx, edx ; 005E _ 48: 63. D2 ; Note: Address is not rip-relative cmp qword [abs M+rdx*8], 0 ; 0061 _ 48: 83. 3C D5, 00000000(d), 00 jz ?_007 ; 006A _ 74, 24 ?_006: ; Note: Address is not rip-relative mov rdx, qword [abs M+rcx*8] ; 006C _ 48: 8B. 14 CD, 00000000(d) ; Note: Address is not rip-relative sub rdx, qword [abs M+rsi*8] ; 0074 _ 48: 2B. 14 F5, 00000000(d) test rdx, rdx ; 007C _ 48: 85. D2 ; Note: Address is not rip-relative mov qword [abs M+rcx*8], rdx ; 007F _ 48: 89. 14 CD, 00000000(d) js ?_008 ; 0087 _ 78, 3F add eax, 3 ; 0089 _ 83. C0, 03 jmp ?_005 ; 008C _ EB, AA ; Filling space: 2H ; Filler type: NOP with prefixes ; db 66H, 90H ALIGN 8 ?_007: mov rdx, qword [rbx] ; 0090 _ 48: 8B. 13 xor eax, eax ; 0093 _ 31. C0 mov esi, ?_003 ; 0095 _ BE, 00000000(d) mov edi, 1 ; 009A _ BF, 00000001 add rbx, 8 ; 009F _ 48: 83. C3, 08 call __printf_chk ; 00A3 _ E8, 00000000(rel) cmp rbx, ?_001 ; 00A8 _ 48: 81. FB, 00000000(d) jnz ?_007 ; 00AF _ 75, DF mov edi, 10 ; 00B1 _ BF, 0000000A call putchar ; 00B6 _ E8, 00000000(rel) pop rbx ; 00BB _ 5B xor eax, eax ; 00BC _ 31. C0 pop rbp ; 00BE _ 5D pop r12 ; 00BF _ 41: 5C ret ; 00C1 _ C3 ; Filling space: 6H ; Filler type: Multi-byte NOP ; db 66H, 0FH, 1FH, 44H, 00H, 00H ALIGN 8 ?_008: add eax, 2 ; 00C8 _ 83. C0, 02 cdqe ; 00CB _ 48: 98 ; Note: Address is not rip-relative mov eax, dword [abs M+rax*8] ; 00CD _ 8B. 04 C5, 00000000(d) jmp ?_005 ; 00D4 _ E9, FFFFFF5F ; main End of function
内容的提问来源于stack exchange,提问作者נירייב שמואל
相关产品推荐
相关产品推荐

