标签: nasm

为什么mov指令直接使用ax而不是两个段寄存器?

我看到代码如下:

mov ax, cs
mov ds, ax
mov es, ax
Run Code Online (Sandbox Code Playgroud)

为什么我不能将其压缩为:

mov ds, cs
mov es, cs
Run Code Online (Sandbox Code Playgroud)

自使用累加器寄存器以来,第一种方式更快吗?但这似乎并不直观,因为cs和ds是段寄存器.还是有一些我不知道的限制?

顺便说一句,我正在使用nasm.

x86 assembly nasm accumulator addressing-mode

6
推荐指数
1
解决办法
604
查看次数

如何使用NASM访问系统时间?

我正在尝试使用当前系统时间为随机数生成器播种.如何使用NASM访问系统时间?(我正在使用linux)

assembly nasm

6
推荐指数
3
解决办法
7023
查看次数

NASM猜数字游戏错了

我决定创建一个使用Linux系统调用的简单猜测数字游戏,以及一些C函数来提供更简单的界面.当我将int转换为字符串并在屏幕上打印正确答案时,我似乎遇到了分段错误.

这是输出:

Enter A Number One Through Ten:" : 
3
Response did not match! The Answer Is:Segmentation fault
Run Code Online (Sandbox Code Playgroud)

这是C代码:

// print.c
#include "/usr/include/stdio.h" 
#include "/usr/include/string.h"
#include "/usr/include/stdlib.h"
#include "/usr/include/time.h"
void print(const char* msg)
{
    printf(msg);
    return;
}
int compare(const char* str, const char* str2)
{
    int i = strcmp(str, str2);
    if (i == 0)
    {
        return 1;
    }
    else
    {
       return 0;
    }
}
int divide(int num, int dem)
{
    if (dem == 0)
    {
        printf("Undefined");
        return 0;
    }
    else …
Run Code Online (Sandbox Code Playgroud)

c linux nasm system-calls segmentation-fault

6
推荐指数
2
解决办法
1191
查看次数

使用NASM + LD编写/链接平面二进制文件

我正在创建自己的"玩具"操作系统,我已经到了我试图理解链接和可执行格式的地步 - 特别是我有一个平面文件二进制格式可执行文件,我将其加载到内存中的地址0x500然后直接打电话.作为一个例子考虑以下两个指令(我知道它的设计,我只想在我的样本中包括a callmov)

mov ax, some_label
call some_label
; some_label is at address 0x99 into the resulting binary
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直使用NASM通过org 0x500命令使用指令来产生所需的输出nasm -f bin myfile.asm.生成的反汇编看起来像这样并且完美地运行:

mov ax, 0x599
call 0x599
Run Code Online (Sandbox Code Playgroud)

我现在想开始使用LD,以便我可以链接其他对象,但经过大量的实验和阅读后,我仍然不明白为什么能够获得可靠的结果.

我收集的比为了产生类似的输出我需要:

  • 让NASM输出到obj格式,其中包含适合链接的符号信息(我选择了ELF,因为它看起来像任何格式一样好)
  • 获取LD将结果与.textsection 的地址相关联0x500,然后将结果作为平面二进制文件发出 - 链接器最终决定在最终二进制文件中解析各种偏移量.

到目前为止,我已经尝试了以下内容:

:: Output as ELF 
nasm -f elf myfile.asm
:: Then link and output as binary with the address of .text as 0x500
ld --oformat binary -Ttext 0x500 myfile.o
Run Code Online (Sandbox Code Playgroud)

但是这给了我以下错误(这是在Mingw上):

ld:不能对非PE输出文件进行PE操作 …

assembly linker nasm ld

6
推荐指数
1
解决办法
5411
查看次数

Linux NASM检测EOF

我正在尝试在linux上学习基础知识,我找不到一个很好的参考.NASM文档似乎假设您已经知道masm ...我在cmp(英特尔指令参考之外)的文档中找不到任何示例.

我编写了一个从stdin读取单个字节并将其写入stdout的程序.下面是我的修改,尝试在stdin上检测EOF并在达到EOF时退出.问题是它永远不会退出.我只是继续打印从stdin读取的最后一个char.问题是在我的EOF检测(cmp ecx, EOF)和/或我跳到_exit标签(je _exit)我认为.

我究竟做错了什么?

%define EOF     -1

section .bss
        char:   resb    1

section .text
        global  _start

_exit:
        mov     eax,    1       ; exit
        mov     ebx,    0       ; exit status
        int     80h

_start:
        mov     eax,    3       ; sys_read
        mov     ebx,    0       ; stdin
        mov     ecx,    char    ; buffer
        cmp     ecx,    EOF     ; EOF?
        je      _exit
        mov     edx,    1       ; read byte count
        int     80h

        mov     eax,    4       ; sys_write
        mov     ebx, …
Run Code Online (Sandbox Code Playgroud)

linux assembly stdin nasm eof

6
推荐指数
1
解决办法
5430
查看次数

Linux程序集和printf

我尝试用printf函数编写简单的汇编程序.我编译它nasm -f elf 64并使用链接gcc.跑完后我明白了segmentation fault.怎么了?

[Bits 32]

extern printf
global main

section .data 

hello:
db "Hello", 0xa, 0 

section .text

main:

push hello
call [printf]

add esp, 4

mov eax, 1
mov ebx, 0
int 80h
Run Code Online (Sandbox Code Playgroud)

c assembly printf nasm

6
推荐指数
1
解决办法
7018
查看次数

无法在NASM中包含文件

我尝试使用包含一个文件到我的boot.asm文件中

%include "input.asm"
Run Code Online (Sandbox Code Playgroud)

但每次我尝试编译它时都会收到错误消息,说nasm无法打开包含文件.
input.incIS与boot.asm在同一目录中我在这里和谷歌寻找答案,但没有人帮助我.

是否有一种特殊的方式包含文件应该在包含之前编译/格式化?或者只是我的鼻子在咆哮?

编辑:这是包含的代码:

mov ax, 0x07C0  ; set up segments
mov ds, ax    mov es, ax
mov si, welcome
call print_string
mov si, welcome2    
call print_string    
mov si, welcome4    
call print_string  
jmp .mainloop

%include 'input.asm'
mainloop:    ;loop here
Run Code Online (Sandbox Code Playgroud)

input.asm:

 ; ================
 ; calls start here
 ; ================

 print_string:
   lodsb        ; grab a byte from SI

   or al, al  ; logical or AL by itself
   jz .done   ; if the result is zero, get out

   mov …
Run Code Online (Sandbox Code Playgroud)

assembly nasm

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

MASM shellcode和NASM shellcode之间是否存在差异

我是StackOverflow的新手.最近,我开始研究汇编,对于汇编来说还是一个新手,对shellcode来说是全新的.我正在使用RadAsm使用MASM汇编程序进行编译,我尝试从这个网站shellcoding for Linux和Windows学习shellcode

我在Windows 64位上使用RadAsm.我使用的代码几乎相同,只是我使用函数的绝对名称而不是DLL中函数的地址.shellcode应该使用带参数的sleep函数5000.

这是我在MASM中使用的代码.

.386
.model flat, stdcall
option casemap:none

include kernel32.inc
includelib kernel32.lib

.code
_start:
    xor eax, eax    ; zero out eax
    mov ebx, Sleep  ; function sleep goes in ebx
    mov ax, 5000    ; parameter goes in ax
    push eax        ; parameter on stack
    call ebx        ; call Sleep
end _start
end
Run Code Online (Sandbox Code Playgroud)

这在MASM中没有错误地组装.

生成的shellcode具有空值,与网站略有不同.它如下.

objdump -d nameofexecutable.exe以前得到了反汇编.

Disassembly of section .text
 00401000 <.text>:
  401000:       33 c0                   xor    %eax,%eax
  401002:       bb …
Run Code Online (Sandbox Code Playgroud)

assembly masm nasm shellcode

6
推荐指数
1
解决办法
1138
查看次数

对于设置传统帧指针的函数,是否有简单的DWARF CFI表示?

我正在编写C,C++和汇编的混合编程,我希望从代码的任何部分获得可靠的回溯.

这主要工作正常的C和C++代码,因为我可以生成调试与信息-g,这对于现代的x86编译器和平台生成DWARF调试信息,这意味着最终的二进制包括CFI(调用帧信息).此信息允许通过当前调用堆栈中的函数向后移动.它可以支持复杂的场景,例如没有基指针的函数以及rsp动态方式的变化.对于C和C++代码,我不必关心:即使对于优化的代码,编译器也会生成正确的CFI.

对于我在nasm中编写的x86汇编代码,CFI是个问题.nasm和语法兼容的竞争对手yasm对生成DWARF信息有一些有限的支持,但它主要涉及指向行映射的指令指针,并且不包括任何CFI 1(实际上,即使它集合也无法真正生成它因为程序集太低而无法明确表达调用/返回语义,所以需要.

我想为程序集生成的例程添加CFI,但我不需要CFI的完全灵活性来根据指令细化更改识别CFA rsp等等:我非常乐意设置标准框架-pointer in rbpfor each assembly function并保持整个函数的完整性.DWARF3是否通过一小段CFI信息支持这种情况,希望我能用汇编器宏生成一个?


1 yasm 的实验性"nextgen" 版本确实支持CFI指令,但该项目尚未在5年内更新.有一个未解决的问题是将此支持移回yasm的主线版本.

debugging x86 nasm backtrace dwarf

6
推荐指数
0
解决办法
209
查看次数

在Windows上编译Nasm程序时未定义的对"WinMain"的引用(MinGW)

我想在Windows上编译Hello World NASM示例.

我已将上面的代码粘贴到一个main.asm文件中,并使用以下命令将其编译为obj文件:

nasm -fwin32 .\main.asm -o main.obj
Run Code Online (Sandbox Code Playgroud)

之后我想将这个obj文件编译成一个exe,如下所示:

g++ .\main.obj -o main.exe -m32
Run Code Online (Sandbox Code Playgroud)

但我得到这个错误:

C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/../lib/gcc/i686-w64-mingw32/8.1.0/../../../../i686-w64-mingw32/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o):crt0_c.c:(.text.startup+0x39): undefined reference to `WinMain@16'
Run Code Online (Sandbox Code Playgroud)

我错过了什么?如何修复此错误?

windows assembly mingw nasm

6
推荐指数
1
解决办法
611
查看次数