标签: nasm

gas vs. nasm:哪个汇编程序产生最佳代码?

这两个工具都将汇编指令直接转换为机器代码,但是有可能确定哪一个生成最快,最干净的代码?

assembly gnu-assembler nasm

10
推荐指数
3
解决办法
7340
查看次数

什么是学习(N)ASM的最佳资源?

我一直想要学习装配一段时间,虽然我之前尝过几次,但我还没有真正能够超越"Hello,world".是否有任何良好的汇编入门教程(最好使用NASM,因为我使用的是Windows和Linux)?

我确实有一些C知识,但主要是高级语言的代码,如Ruby,Python,C#和JavaScript.

assembly nasm

9
推荐指数
2
解决办法
5601
查看次数

在内核ASM(NASM汇编程序)中将视频模式设置为1920x1080(HD)或更高

我想在ASM内核中设置视频模式我正在处理视频模式1920x1080或更高(或至少高于VESA中的通常限制).反正有没有这样做,如果有,提供示例代码?

我正在使用NASM来编写内核代码.

video assembly kernel nasm vesa

9
推荐指数
1
解决办法
1453
查看次数

如何编写引导程序来加载ac内核?

我正在学习NASM,因为我编写了bootloaders.到目前为止,我有一个hello world bootloader.我想知道如何将ac程序链接到它并让bootloader将其加载到内存中并开始执行它的入口点函数.我需要NASM代码,因为我是NASM n00b.非常感谢你的帮助.

编辑:基本上我需要知道如何链接c程序,我需要NASM代码tsrat它的入口点功能.我应该知道的任何陷阱?

c assembly kernel nasm bootloader

9
推荐指数
1
解决办法
4933
查看次数

GDB抱怨没有可用的来源

我正在使用Ubuntu 12.10 64bit.

我正在尝试在GDB中调试一个简单的汇编程序.但是GDB的gui模式(-tui)似乎无法找到我的汇编文件的源代码.我在目前的目录中重建了该项目并搜索谷歌无济于事,请在这里帮助我.

我的命令:

nasm -f elf64 -g -F dwarf hello.asm

gcc -g hello.o -o hello

gdb -tui hello
Run Code Online (Sandbox Code Playgroud)

似乎加载了调试信息,我可以在main()处设置断点,但屏幕的上半部分仍然显示' [No Source Available] '.

如果你有兴趣,这是hello.asm:

;  hello.asm  a first program for nasm for Linux, Intel, gcc
;
; assemble: nasm -f elf -l hello.lst  hello.asm
; link:     gcc -o hello  hello.o
; run:          hello 
; output is:    Hello World 

    SECTION .data       ; data section
msg:    db "Hello World",10 ; the string to print, 10=cr
len:    equ $-msg       ; "$" …
Run Code Online (Sandbox Code Playgroud)

linux assembly gdb nasm

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

如何在MacOSX上使用nasm进行编译

我正在尝试编译和链接我在Assembler上的第一个程序.我尝试编译以下代码:

; %include "stud_io.inc"    
global _main     

section .text
_main: 
    xor eax, eax
again:
    ; PRINT "Hello"
    ; PUTCHAR 10
    inc eax     
    cmp eax, 5
    jl again
Run Code Online (Sandbox Code Playgroud)

在用于编译和链接程序的控制台命令下面:

-bash-3.2$ nasm -f macho main.asm -o main.o  && ld -e _main -macosx_version_min 10.8 -arch x86_64 main.o
Run Code Online (Sandbox Code Playgroud)

但结果是:

ld: warning: ignoring file main.o, file was built for i386 which is not the architecture being linked (x86_64): main.o
Undefined symbols for architecture x86_64:
  "_main", referenced from:
     -u command line option
ld: symbol(s) not found for …
Run Code Online (Sandbox Code Playgroud)

assembly nasm

9
推荐指数
1
解决办法
8655
查看次数

为什么不能通过调用c库printf stdout asm被管道传输到其他程序?

我写了一个简单的NASM程序:

printtest.asm

section .data
str_out db "val = %d",10,0

section .text

global main

extern printf

main:

    PUSH 5
    PUSH DWORD str_out
    CALL printf
    ADD ESP, 8
    MOV EAX, 1
    INT 80h
Run Code Online (Sandbox Code Playgroud)

我使用以下命令链接并创建可执行文件:

nasm -f elf -l printtest.lst printtest.asm
gcc -o  printtest printtest.o
Run Code Online (Sandbox Code Playgroud)

链接和执行时,这将打印"val = 5"没有问题.据我所知,printf默认情况下调用会写入stdout.那么为什么当我尝试将其传输到另一个程序时,其他程序似乎没有收到任何输入?

例如

./printtest | cat
Run Code Online (Sandbox Code Playgroud)

似乎什么都不做

我相信我从根本上误解了一些问题.

c linux assembly nasm

9
推荐指数
1
解决办法
129
查看次数

64位模式不支持PUSH和POP指令

NASM返回如下错误:"在64位模式下不支持指令",我无法弄清楚要做什么.

主题说明pop ecxpush ecx说明.我可以使用什么代替它们,还是有其他方法来解决这个问题?

assembly x86-64 nasm

9
推荐指数
1
解决办法
9790
查看次数

符号名称与新NASM版本中的新注册名称冲突?

想象一下你10年前写的这篇文章(在英特尔MPXbnd0.. bnd3注册表甚至在路线图上之前):

section .data

; define some globals which are part of an ABI so you can't just rename them
global bnd0      ; MPX bound register name conflict
bnd0: dd 123

global k0        ; AVX512 mask register name conflict
k0: dq 12345
Run Code Online (Sandbox Code Playgroud)

如何使用当前版本的NASM进行组装? 即NASM(或YASM)是否与支持新注册名称的新版本具有向前兼容性?

显然,在单个文件或项目中搜索/替换很容易解决.但理论上,您可以将全局变量名称作为库ABI的一部分,您可以从NASM导出或需要导入到NASM中extern ymm0.(必须声明外部符号,因此无法识别的寄存器名称永远不会汇编为符号引用.)

NASM语法已经不适合作为平台上C编译器输出的格式,这些平台不会为符号名称添加前缀_或执行其他类型的名称修改(例如Linux ELF).你无法编译全局int eax = 1;. 这就是AT&T语法%eax用于寄存器名称的原因.对该答案的评论中的讨论是启发这个问题的原因.请注意,GAS不需要声明外部符号; 无法识别的名称被视为符号(即使在.intel_syntax noprefix使用类似于MASM的语法的模式中).

相关:MASM如何处理新扩展的前向源兼容性?


你能以某种方式禁用MPX支持吗?

YASM支持一个CPU指令,允许您禁用对某些助记符的支持,但即使禁用AVX支持也不允许您将其ymm0用作符号名称.(YASM …

x86 assembly naming nasm forward-compatibility

9
推荐指数
1
解决办法
605
查看次数

使用MOV指令将SS设置为0x0000是否应该在64位模式下导致#GP(0)故障?

这个问题是受r / osdev中Reddit问题启发的,除了这个问题集中在SS寄存器上。可能有人说过RTFM(代表ISA条目MOV),但是当出现此问题时,即使在OS开发人员中,它也会得到不同的答案。


问题:使用MOV指令将SS设置为0x0000是否会#GP(0)在64位模式下引起一般性保护故障?例如:如果我处于64位模式,并且当前特权级别(CPL)为0,我应该期望看到#GP(0)带有以下代码段的:

NULL_SEL_RPL0  EQU 0    
mov eax, NULL_SEL_RPL0         ; EAX = 0x0000 = NULL Selector with
                               ;     Requested Privilege Level (RPL) 0. 
mov ss, eax                    ; Try to set SS with NULL selector 0x0000
                               ; Should this cause a #GP(0) fault?
Run Code Online (Sandbox Code Playgroud)

《 Intel x86指令集参考》所说的MOV是:

Operation
DEST ? SRC;
Loading a segment register while in protected mode results in special checks and …
Run Code Online (Sandbox Code Playgroud)

64-bit assembly x86-64 nasm osdev

9
推荐指数
1
解决办法
199
查看次数