这两个工具都将汇编指令直接转换为机器代码,但是有可能确定哪一个生成最快,最干净的代码?
我一直想要学习装配一段时间,虽然我之前尝过几次,但我还没有真正能够超越"Hello,world".是否有任何良好的汇编入门教程(最好使用NASM,因为我使用的是Windows和Linux)?
我确实有一些C知识,但主要是高级语言的代码,如Ruby,Python,C#和JavaScript.
我想在ASM内核中设置视频模式我正在处理视频模式1920x1080或更高(或至少高于VESA中的通常限制).反正有没有这样做,如果有,提供示例代码?
我正在使用NASM来编写内核代码.
我正在学习NASM,因为我编写了bootloaders.到目前为止,我有一个hello world bootloader.我想知道如何将ac程序链接到它并让bootloader将其加载到内存中并开始执行它的入口点函数.我需要NASM代码,因为我是NASM n00b.非常感谢你的帮助.
编辑:基本上我需要知道如何链接c程序,我需要NASM代码tsrat它的入口点功能.我应该知道的任何陷阱?
我正在使用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) 我正在尝试编译和链接我在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) 我写了一个简单的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)
似乎什么都不做
我相信我从根本上误解了一些问题.
NASM返回如下错误:"在64位模式下不支持指令",我无法弄清楚要做什么.
主题说明pop ecx和push ecx说明.我可以使用什么代替它们,还是有其他方法来解决这个问题?
想象一下你10年前写的这篇文章(在英特尔MPX和bnd0.. 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 …
这个问题是受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是:
Run Code Online (Sandbox Code Playgroud)Operation DEST ? SRC; Loading a segment register while in protected mode results in special checks and …