假设我声明了以下内容:
section .bss
buffer resb 1
Run Code Online (Sandbox Code Playgroud)
这些说明如下:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
Run Code Online (Sandbox Code Playgroud)
我是否理解bl将包含值5,并且cl将包含变量的内存地址section .text?
我对两者之间的差异感到困惑
buffervsmov cl, buffer 更新:阅读回复后,我认为以下摘要是准确的:
假设声明mov cl, [buffer]存在于mov edi, array.我的理解是:
edi将第0个数组索引的内存地址放入mov byte [edi], 3.add edi, 3 将VALUE 3放入数组的第0个索引中edi,mov al, [array]现在包含数组第3个索引的内存地址al将DATA置于第零个索引中mov al, [array+3].al将DATA放在第三个索引处mov [al], …我有以下工作NASM代码:
global _start
section .text
_start:
mov eax, 0x4
mov ebx, 0x1
mov ecx, message
mov edx, 0xF
int 0x80
mov eax, 0x1
mov ebx, 0x0
int 0x80
section .data
message: db "Hello, World!", 0dh, 0ah
Run Code Online (Sandbox Code Playgroud)
在屏幕上打印"Hello,World!\n".我还有以下C包装器,其中包含以前的NASM对象代码:
char code[] =
"\xb8\x04\x00\x00\x00"
"\xbb\x01\x00\x00\x00"
"\xb9\x00\x00\x00\x00"
"\xba\x0f\x00\x00\x00"
"\xcd\x80\xb8\x01\x00"
"\x00\x00\xbb\x00\x00"
"\x00\x00\xcd\x80";
int main(void)
{
(*(void(*)())code)();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行代码时,似乎没有执行汇编程序代码,但程序退出正常.有任何想法吗?
谢谢
我正在使用ubuntu 64位并尝试在NASM上运行.asm文件.但是当我尝试运行以下代码时它会返回此错误.我想要做的是通过从源代码编译(或汇编)目标文件来构建可执行文件
$ nasm -f elf hello.asm,然后在创建文件后hello.o通过调用链接器从目标文件生成可执行文件本身
$ ld -s -o hello hello.o
Run Code Online (Sandbox Code Playgroud)
这将最终构建hello可执行文件.
我正在关注这个教程http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html
错误:
输入文件`hello.o'的i386体系结构与i386:x86-64输出不兼容
码:
section .data ;section declaration
msg db "Hello, world!",0xa ;our dear string
len equ $ - msg ;length of our dear string
section .text ;section declaration
;we must export the entry point to the ELF linker or
global _start ;loader. They conventionally recognize _start as their
;entry point. Use ld -e foo to override the default.
_start:
;write our …Run Code Online (Sandbox Code Playgroud) 我已经完成了ARM汇编编程,我想学习英特尔汇编程序.我一直听到所提到的所有这些不同的F/M/N/ASM-但我不确定它们与我希望实现的目标有什么关系?
有人可以帮我确定一下我需要学习如何在英特尔架构上编程低级别吗?我不太明白"不同的汇编程序"如何关联,x86,IA64,AMD64/x86-64等更是如此?
如果它有任何帮助,我最熟悉Eclipse和Visual Studio 08/10 IDE.
这是我的汇编级代码......
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data
mesg db 'KingKong',0xa
size equ $-mesg
Run Code Online (Sandbox Code Playgroud)
输出:
root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out
KingKong
Run Code Online (Sandbox Code Playgroud)
我的问题是全球_start用于什么?我和Mr.Google试了一下运气,我发现它用来说明程序的起点.为什么我们不能_start告诉程序在哪里开始,如下面给出的那个在屏幕上产生一种警告
section .text
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, size
int 0x80
exit: mov eax, 1
int 0x80
section .data …Run Code Online (Sandbox Code Playgroud) 什么是大小tword,oword以及yword操作数,如使用NASM/YASM手册?在相关的说明中,这些名称是否存在技巧或潜在的想法?有没有一种方法可以为更大的字大小赋予逻辑名称?
我知道,虽然字大小可以系统之间是不同的,一个NASM word是2个字节,dword是两倍(4个字节),qword是一个四字(8个字节),但是...是tword一个三重字(6个字节)?而对于oword和yword我甚至不能想象的一个似是而非的含义.
请注意,这可能是一个简单的问题,但我找不到答案.在NASM和YASM手册这些尺寸没有解释,甚至没有在DQ,DT,DY,RESQ,REST,RESY伪指令.我读到MASM使用类似系统的地方,但也找不到任何东西.
编辑:根据答案,这是完整的列表:
byteDBRESBwordDWRESWdwordDDRESDqwordDQRESQtwordDTRESToword,DO,,RESODDQRESDQywordDYRESY我有一些通常具有以下结构的NASM文件:
[BITS 64]
[ORG 0x0000000000200000]
start:
...
ret
Run Code Online (Sandbox Code Playgroud)
我正在组装它们:
nasm -f bin abc.asm
Run Code Online (Sandbox Code Playgroud)
我想用GAS写一些这些.两个问题:
我应该在GAS中使用哪些指令?我找到了'.org'指令,但GAS似乎没有'.bits'指令.
我应该传递什么gcc或as生成一个普通的二进制文件?即-f binNASM 的选项是什么.
测试平台是32位Linux.
基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.
我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......
所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?
len: equ 2
len: db 2
Run Code Online (Sandbox Code Playgroud)
它们是否相同,产生的标签可以代替2?如果没有,那么每份申报表的优缺点是什么?它们可以互换使用吗?
我正在使用一些婴儿NASM程序来帮助我学习语言.
根据我的阅读,NASM程序可以有三个部分; .data,.bss和.text是必需的.然而,我经常发现,有时候这些部门的名称是,而有时候也是section如此segment.
例如,我在网上发现了这个"Hello World":
; 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 ; "$" means "here"
; len is a value, not an address
SECTION .text ; code section
global main …Run Code Online (Sandbox Code Playgroud)