标签: nasm

当使用NASM extern语句访问printf时,GCC输出错误"未定义引用`printf'"

我正在学习NASM并且正在编译这段代码(我在这里找到).它使用此NASM命令组装:

nasm -f coff -l printf.lst  printf1.asm
Run Code Online (Sandbox Code Playgroud)

printf.o但这GCC链接命令:

gcc -o printf1  printf1.o
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:

printf1.o:printf1.asm:(.text+0x1a): undefined reference to `printf'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?提前致谢.(编辑:我在Windows 7上);

; printf1.asm   print an integer from storage and from a register
; Assemble: nasm -f coff -l printf.lst  printf1.asm
; Link:     gcc -o printf1  printf1.o
; Run:      printf1
; Output:   a=5, eax=7

; Equivalent C code
; /* printf1.c  print an int and an expression */
; #include …
Run Code Online (Sandbox Code Playgroud)

c gcc mingw nasm

7
推荐指数
1
解决办法
7105
查看次数

在Linux上输出程序集中的整数

这需要在纯汇编中完成(即没有库或调用C).

我理解问题的本质:需要将整数除以10,将一位数的余数转换为ASCII,然后输出,然后用商重复该过程.

但由于某种原因,它只是不起作用.我在x86上使用NASM.

这是我现在所拥有的(不输出任何内容,但也不会抛出任何汇编错误):

; integer to output is stored in eax
mov ecx, 10   ; for base 10

loop:
div ecx  ;EAX contains the quotient, EDX the remainder

; Do something to EDX to convert it to ASCII, not sure if this is correct
add edx, '0'

push eax    ;We'll be playing with EAX to output EDX, save EAX to the stack

mov eax, 4              ; sys_write
mov ebx, 1              ; to STDOUT
mov ecx, edx
mov edx, 1 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm

7
推荐指数
1
解决办法
3125
查看次数

Bootloader奇怪的行为

我一直在尝试设计一个简单的操作系统,只是引导扇区,以及带有中断的16位实模式.我终于能够制作OS/bootloader,我在虚拟盒中进行了测试,并且它有效.

然后我将图像刻录到CD上,并将其启动到我的旧桌面,使用Pentium 4,BIOS修订版A05和1GB内存,并且它工作得很好 - 一个简单的操作系统,在顶部打印一个"标题"屏幕,所有它允许您键入屏幕,注册几个键导航光标.

然后我将光盘插入我1年前的笔记本电脑,配备i5处理器,2.6 GB RAM和A05 BIOS Revision,光标似乎随机移动,高速打印随机字符,最后停在anscii字符处235(扩展字符表的一部分),此时键盘工作正常,指定移动光标的键工作正常,只是标题.这是我测试它的计算机,对其进行了编译,编写并将其刻录成CD.(我使用Linux Mint 12 OS)

我已经跳过了我认为需要做的所有"箍":制作了一个iso图像,遵循El Torito'无仿真'启动标准,启动签名,512字节,并写入正确的扇区.

这是我的代码的问题,我没有做某事,或者这是正常的吗?

这是我的代码(NASM x86语法):

    ;**************************
    ; Note OS, Experimental OS
    ;**************************
    [org 0x7C00]
    [bits 16]
    start:
    jmp loader                           ;jump to the actual start of bootloader
    times 8 - ($ - $$) db 0          ;pad eight bytes

    ;*********************
    ;El Torito Boot Info Table
    ;*********************

    ;in nasm, I couldn't figure out how to reserve bytes, in the middle of .text
    ;so I zeroed it out.
    times 56 db …
Run Code Online (Sandbox Code Playgroud)

assembly operating-system nasm 16-bit bootloader

7
推荐指数
1
解决办法
569
查看次数

找不到crtn.o,在64位系统上链接32位代码

我试图在64位系统上使用NASM和GCC组装一些32位代码.我使用以下两个命令

nasm -f elf32 -g -F stabs coc.asm
gcc -m32 -o coc coc.o
Run Code Online (Sandbox Code Playgroud)

LDM看起来很好,但LD抱怨:

/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/libgcc_s.so when searching for -lgcc_s …
Run Code Online (Sandbox Code Playgroud)

64-bit gcc nasm ld

7
推荐指数
1
解决办法
1万
查看次数

Nasm错误:操作码和操作数的无效组合

在我学习NASM的过程中,我试图创建一个非常简单的程序来进行除法并输出结果.

通过书籍,一切都应该运行良好.我将15除以3,它应该自动存储在AX寄存器中,然后我转移到ecx进行输出.

但是,当我尝试编译时,我收到错误

nums.asm:6: error: invalid combination of opcode and operands
nums.asm:7: error: invalid combination of opcode and operands
Run Code Online (Sandbox Code Playgroud)

有谁知道第6和第7行有什么问题吗?

这是我的代码:

segment .text

    global main
main:

    div     3, 15
    mov     ecx, ax
    mov ebx,1       ; arg1, where to write, screen
    mov eax,4       ; write sysout command to int 80 hex
    int 0x80        ; interrupt 80 hex, call kernel



exit:   mov eax, 1
    xor ebx, ebx 
    int 0x80
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm cpu-registers integer-division

7
推荐指数
1
解决办法
2万
查看次数

如何阅读NASM程序集.lst列表文件

我写了一个NASM程序并使用它创建了一个列表文件nasm -f elf -l rs.lst rs.asm.该程序完美地工作,接收键输入值,并输出值是控制键还是可打印键,以及它是数字,小写还是大写字母.

我需要帮助理解我在.lst文件中读到的内容.左边的数字是地址吗?说明?他们代表记忆吗?这是.lst.

     1                                  segment .data
        //Removed my student ID info                            
     8                                      ;Program Output Strings
     9                                  
    10 00000023 5072657373204B6579-         askForKey: db 'Press Key and Enter: ', 10   ; ;10 is the newline value
    11 0000002C 20616E6420456E7465-
    12 00000035 723A200A           
    13                                      askLen: equ $-askForKey
    14                                  
    15 00000039 436F6E74726F6C204B-         controlKey: db 'Control Key ', 10
    16 00000042 6579200A           
    17                                      controlLen: equ $-controlKey
    18                                      
    19 00000046 5072696E7461626C65-         printableKey: db 'Printable Key ', 10   
    20 0000004F …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm listings

7
推荐指数
1
解决办法
8513
查看次数

为什么C代码中的1.0f在生成的程序集中表示为1065353216?

在CI中有这个代码块:

if(x==1){
    a[j][i]=1;
}
else{
    a[j][i]=0;
}
Run Code Online (Sandbox Code Playgroud)

a 是一个浮点值矩阵,如果我试图在nasm语法中看到此代码的编译程序集

a[j][i]=0;分配,以这种方式编码

dword [rsi+rdi], 0
Run Code Online (Sandbox Code Playgroud)

但行a[j][i]=1;分配是以这种方式编码的

dword [rsi+rdi], 1065353216
Run Code Online (Sandbox Code Playgroud)

1065353216如何代表1.0f

c floating-point assembly nasm

7
推荐指数
2
解决办法
2938
查看次数

近呼叫/跳转表并不总是在引导加载程序中工作

一般问题

我一直在开发一个简单的引导加载程序,并且在某些环境中偶然发现问题,这些环境中的指令不起作用:

mov si, call_tbl      ; SI=Call table pointer
call [call_tbl]       ; Call print_char using near indirect absolute call
                      ; via memory operand
call [ds:call_tbl]    ; Call print_char using near indirect absolute call
                      ; via memory operand w/segment override
call near [si]        ; Call print_char using near indirect absolute call
                      ; via register
Run Code Online (Sandbox Code Playgroud)

这些中的每一个碰巧涉及间接接近CALL到绝对存储器偏移.我发现如果我使用类似的JMP表,我会遇到问题.相对的呼叫和跳转似乎没有受到影响.像这样的代码有效:

call print_char 
Run Code Online (Sandbox Code Playgroud)

我已经通过海报讨论了Stackoverflow上提出的建议,讨论了编写引导加载程序的注意事项.特别是我看到这个Stackoverflow回答了一般的Bootloader技巧.第一个提示是:

  1. 当BIOS跳转到您的代码时,您不能依赖具有有效或预期值的CS,DS,ES,SS,SP寄存器.应在引导加载程序启动时正确设置它们.您只能保证将从物理地址0x07c00加载并运行引导加载程序,并将引导驱动器号加载到DL寄存器中. …

x86 assembly real-mode nasm bootloader

7
推荐指数
1
解决办法
584
查看次数

如何将文本文件的内容添加为ELF文件中的一部分?

我有一个NASM程序集文件,我正在组装和链接(在Intel-64 Linux上).

有一个文本文件,我希望文本文件的内容出现在生成的二进制文件中(基本上是一个字符串).二进制文件是ELF可执行文件.

我的计划是在ELF文件中创建一个新的只读数据部分(相当于传统.rodata部分).

理想情况下,会有一个工具来逐字添加文件作为elf文件中的新部分,或者是一个逐字包含文件的链接器选项.

这可能吗?

x86 linker nasm elf objcopy

7
推荐指数
1
解决办法
3043
查看次数

链接两个或多个程序集文件

我正在开发一个简单而小型的64位操作系统。到目前为止,我只使用一个文件,并使用NASM进行编译:

nasm -f bin os.asm -o os.bin
Run Code Online (Sandbox Code Playgroud)

然后.bin用qemu 测试文件。
现在,我需要在文件中使用多个os.bin文件。我插入了这一行:

extern helper_func
Run Code Online (Sandbox Code Playgroud)

然后在代码中调用它。在另一个.asm文件中,我创建了此函数或过程。问题是bin格式不支持extern,因此我尝试使用ELF格式创建.obj文件,然后将它们与gcc链接:

gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld
Run Code Online (Sandbox Code Playgroud)

与此链接文件:

ENTRY(_start)

SECTIONS
{
    . = 0x7C00;

    .text :
    {
        *(.text);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行.bin已创建的时,qemu无法识别该文件。我做错了什么?

(我使用过gcc是因为我计划将来使用C代码)

实际上,我什至不知道gcc中所有标志的作用。我已经从Internet XD复制了它们。

到目前为止,这是我所做的:

nasm -f elf os.asm -o os.obj
nasm -f elf helper.asm -o helper.obj
gcc -m32 -nostdlib -nodefaultlibs -lgcc os.obj helper.obj -t linker.ld -o myos.bin
objcopy --input-target=elf32-little --output-target=binary myos.bin myos.bin.new
qemu-system-x86_64 myos.bin.new …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm osdev bootloader

7
推荐指数
1
解决办法
134
查看次数