标签: nasm

x86 Assembly和yasm中immediates(方括号)的基本用法

假设我声明了以下内容:

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], …

x86 assembly nasm memory-address yasm

28
推荐指数
3
解决办法
2万
查看次数

Linux Shellcode"Hello,World!"

我有以下工作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)

但是,当我运行代码时,似乎没有执行汇编程序代码,但程序退出正常.有任何想法吗?

谢谢

c linux assembly nasm shellcode

27
推荐指数
2
解决办法
3万
查看次数

尝试在Ubuntu上运行NASM上的.asm文件时出错

我正在使用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)

linux ubuntu assembly nasm

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

ASM:MASM,NASM,FASM?

我已经完成了ARM汇编编程,我想学习英特尔汇编程序.我一直听到所提到的所有这些不同的F/M/N/ASM-但我不确定它们与我希望实现的目标有什么关系?

有人可以帮我确定一下我需要学习如何在英特尔架构上编程低级别吗?我不太明白"不同的汇编程序"如何关联,x86,IA64,AMD64/x86-64等更是如此?

如果它有任何帮助,我最熟悉Eclipse和Visual Studio 08/10 IDE.

assembly intel masm nasm fasm

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

汇编语言中的全局_start是什么?

这是我的汇编级代码......

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)

assembly nasm

23
推荐指数
3
解决办法
3万
查看次数

tword,oword和yword操作数的大小是多少?

什么是大小tword,oword以及yword操作数,如使用NASM/YASM手册?在相关的说明中,这些名称是否存在技巧或潜在的想法?有没有一种方法可以为更大的字大小赋予逻辑名称?

我知道,虽然字大小可以系统之间是不同的,一个NASM word是2个字节,dword是两倍(4个字节),qword是一个四字(8个字节),但是...是tword一个三重字(6个字节)?而对于owordyword我甚至不能想象的一个似是而非的含义.

请注意,这可能是一个简单的问题,但我找不到答案.在NASM和YASM手册这些尺寸没有解释,甚至没有在DQ,DT,DY,RESQ,REST,RESY伪指令.我读到MASM使用类似系统的地方,但也找不到任何东西.


编辑:根据答案,这是完整的列表:

  • 1个字节(8位): ,,byteDBRESB
  • 2个字节(16位): ,,wordDWRESW
  • 4个字节(32位): ,,dwordDDRESD
  • 8个字节(64位): ,,qwordDQRESQ
  • 10个字节(80位): ,,twordDTREST
  • 16个字节(128位): ,oword,DO,,RESODDQRESDQ
  • 32个字节(256位): ,,ywordDYRESY
  • 64个字节(512位): …

assembly nasm cpu-word word-size yasm

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

如何使用GNU GAS汇编程序生成像nasm -f bin这样的普通二进制文件?

我有一些通常具有以下结构的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'指令.

  • 我应该传递什么gccas生成一个普通的二进制文件?即-f binNASM 的选项是什么.

assembly gnu-assembler nasm

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

如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

测试平台是32位Linux.

基本上,我知道gcc可以用来生成Intel和At&T样式的汇编代码,但似乎你不能直接使用nasm/tasm来编译生成的Intel样式汇编代码.

我正在Windows和Linux平台上进行项目分析asm代码,所以我想如果它们都可以由像nasm\yasm这样的平台独立汇编程序编译,我可以有一个更容易的时间......

所以我的问题是如何从Linux上的c源代码生成一个nasm可编译的汇编代码?

assembly gnu-assembler nasm tasm yasm

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

NASM中equ和db之间有什么区别?

len:  equ  2
len:  db   2
Run Code Online (Sandbox Code Playgroud)

它们是否相同,产生的标签可以代替2?如果没有,那么每份申报表的优缺点是什么?它们可以互换使用吗?

nasm

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

NASM中"section"和"segment"之间的区别

我正在使用一些婴儿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)

syntax assembly nasm

19
推荐指数
1
解决办法
8048
查看次数

标签 统计

nasm ×10

assembly ×9

yasm ×3

gnu-assembler ×2

linux ×2

c ×1

cpu-word ×1

fasm ×1

intel ×1

masm ×1

memory-address ×1

shellcode ×1

syntax ×1

tasm ×1

ubuntu ×1

word-size ×1

x86 ×1