Articles of nasm

如何将C运行时库链接到“ld”?

我正在和NASM一起学习我在大学的课程。 我想链接C运行时库与ld ,但我似乎无法绕过它的头。 我有一台安装了Linux Mint的64 bit机器。 我感到困惑的原因是 – 据我所知 – 而不是链接C运行时, gcc将你需要的东西复制到你的程序中。 我可能是错的,所以请毫不犹豫地纠正我。 我现在所做的就是使用gcc来链接它。 这就产生了一堆我rbx的机器代码,即使是像rbx交换rax这样的小程序,这对于学习目的来说也不是那么好。 (请注意,该计划的工作。) 我不确定它是否相关,但这些是我用来编译和链接的命令: # compilation nasm -f elf64 swap.asm # gcc gcc -o swap swap.o # ld, no c runtime ld -s -o swap swap.o 先谢谢你! 结论: 现在我对这个问题有了一个正确的答案,下面是我想提到的一些事情。 dynamic链接glibc可以像在Z boson的答案中一样完成(对于64位系统)。 如果你想静态的做 , 请按照这个链接 (我从Z博信的回答重新张贴)。 这是Jester发表的一篇文章,讲述了如何在linux中启动程序 。 要查看gcc做什么来链接你的.o -s,试试这个命令: gcc -v -o […]

为什么不能从调用c库printf在标准输出到其他程序?

我写了一个简单的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 我使用以下命令链接并创build一个可执行文件: nasm -f elf -l printtest.lst printtest.asm gcc -o printtest printtest.o 链接和执行时,这将打印“val = 5”到控制台没有问题。 据我所知,默认情况下调用printf写在stdout 。 那么为什么当我尝试将这个pipe道传给另一个程序时,另一个程序似乎没有收到任何input? 例如 ./printtest | cat 似乎什么都不做 我相信我在这里从根本上误解了一些东西。

为什么sys_read系统调用在检测到新行时结束?

我是一个汇编(使用nasm)的初学者。 我正在通过大学课程学习大会。 我试图了解sys_read linux系统调用时的行为。 具体来说, sys_read在读取新行或换行时停止 。 根据我所教导的,这是真的。 这个在线教程文章也肯定了事实/主张。 当sys_read检测到换行符时,控制权返回到程序,用户input位于您在ECX中传递的内存地址处。 我检查了sys_read调用的linux程序员手册(通过“man 2 read”)。 它没有提到它应该的行为,对吧? read()尝试读取从文件描述符fd开始在buf处开始的字节数。 在支持查找的文件上,读取操作从文件偏移处开始,文件偏移量按读取的字节数递增。 如果文件偏移量位于或超过文件末尾,则不读取任何字节,并且read()返回零。 如果计数为零,则read()可能检测到下面描述的错误。 在没有任何错误的情况下,或者如果read()不检查错误,则计数为0的read()将返回零,并且没有其他效果。 如果count大于SSIZE_MAX,则结果是未指定的。 所以我的问题是,为什么行为会发生? 这是在Linux内核的一个规范,这应该发生还是其他的一个结果呢?

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

我正在使用Ubuntu 64位,并试图在NASM上运行.asm文件。 但是当我尝试运行下面的代码时它返回这个错误。 我要做的是通过编译(或汇编)源$ nasm -f elf hello.asm目标文件来构build可执行文件,然后在创build文件hello.o之后,通过调用链接器从目标文件生成可执行文件本身 $ ld -s -o hello hello.o 这将最终构buildhello可执行文件。 我正在按照这个教程http://www.faqs.org/docs/Linux-HOWTO/Assembly-HOWTO.html 错误: input文件“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 […]

基本但彻底的汇编教程(Linux)?

我想学习一些刚刚在课堂上学习基本概念的实用汇编语言。 是否有任何像样的书籍或教程(nasm等)将被推荐?

立即打电话与靠近

所以最近我一直想从程序集中调用一些win32调用,而且我一直在使用NASM作为我的外部汇编程序。 我以下面的方式在代码中调用SendMessage : call __imp__SendMessageW@16 这被组装成一个相对跳转(0xE8操作码),结果是访问冲突。 在debugging器中,计算出来的跳转偏移量似乎是正确的(在__imp__SendMessageW@16中似乎确实存在),但是它并不起作用。 当我从C ++调用函数时,检查由Visual Studio生成的程序集时,我注意到它不是它正在使用的相对直接跳转,而是(以MASM的语言) call dword ptr [__imp__SendMessageW@16]到一个0xFF15操作码。 经过一番争论之后,我发现NASM语法把这个编码call dword near [dword __imp__SendMessageW@16] ,并且让我的代码突然call dword near [dword __imp__SendMessageW@16]了。 我的问题是,为什么一个工作,而不是另一个? 是否有一些代码重定位,导致相对的即时调用跳到不友好的地方? 我从来不是一个程序员,但我的印象是总是这两个调用应该做同样的事情,主要的区别是一个是位置独立的,另一个不是(假设他们把IP移到同一个地方)。 代码理论的重新定位是有道理的,但是那么如何解释显示正确地址的debugging器呢? 另外:这个调用中[]语法的逻辑是什么? 偏移量仍然是一个立即数(只是在0xFF15之后立即编码的小端),除了取指令之外,我还没有进行任何存储器访问(我倾向于认为[]是lea的上下文之外的解引用)。

与NASM一起使用DLL

我一直在使用NASM在Windows中进行一些x86编程,而且我遇到了一些困惑。 我很困惑,为什么我必须这样做: extern _ExitProcess@4 具体而言,我对“_”和“@ 4”感到困惑。 我知道'@ 4'是堆栈的大小,但它为什么需要? 当我用hex编辑器查看kernel32.dll时,我只看到“ExitProcess”而不是“_ExitProcess @ 4”。 我也困惑,为什么C函数不需要下划线和堆栈大小,如下所示: extern printf 为什么C函数不需要装饰? 我的第三个问题是“这是我应该使用这些function的方式吗?” 现在我正在链接到实际的dll文件本身。

尝试通过导入部分直接调用函数

我一直在用汇编语言搞乱PE文件结构。 我很确定我已经正确地进入了导入部分。 我使用这个作为参考,其中每个框等于4个字节: +————————-+————————-+ | RVA to a list of | DATE/TIME | | pointer to APIs names | | IMPORT DATA DIRECTORY +————————-+————————-+ #1 | .DLL address (unused) | RVA to .DLL name | +————————-+————————-+ |RVA to API address list | +————————-+ OllyDbg的。 注意eax在右边的值(00402048),然后查看突出显示的调用指令的值跳转到(00402000)。 我尝试从ExitProcess (RVA到API地址列表)中调用第一个第一个函数,但是当我尝试向该地址发出调用时,它导致我的程序崩溃。 当我使用Ollydbg进行debugging时,发现调用ExitProcess时的地址与我在列表中find的地址不同。 在Ollydbg中,当调用ExitProcess指向<JMP。&KERNEL32.ExitProcess>时,find的地址指向<&KERNEL32.ExitProcess>。 我已经读过某种关于某种jmp存根的地方。 这是什么? 我应该如何调用“RVA到API地址列表”中的函数? 我知道这可能是混乱。 如果你需要更多的澄清,让我知道。 这里是代码: […]

导入NASM不起作用?

我想在Windows 7(与NASM)上编译下面的代码: [BITS 32] extern ExitProcess import ExitProcess kernel32.dll extern MessageBoxA import MessageBoxA user32.dll segment .data use32 Caption db 'Caption Text',0 Text db "My MessageBox Text.",0 segment .code use32 ..start: push dword 0 push dword Caption push dword Text push dword 0 call [MessageBoxA] push dword 0 call [ExitProcess] 为了编译这个,我尝试了nasm -o test.o test.asm ,但是接着说: test.asm:4: […]

如何在Windows上编译OpenSSL?

我一直遵循OpenSSL用户指南中的说明,该指南链接到3noch编写OpenSSL 的指南 。 这里是我正在使用的工具/版本: ActiveState Perl v5.20.2 Microsoft Visual Studio 2012 Netwide Assembler(NASM)v2.12.02 OpenSSL 1.0.2j(源码tarball) 按照说明,我可以执行以下命令而不会出现问题: perl Configure VC-WIN32 –prefix=C:\Build-OpenSSL-VC-32 ms\do_ms 然后,当我继续执行 nmake -f ms\nt.mak 我收到以下 Assembling: tmp32\sha1-586.asm tmp32\sha1-586.asm(1432) : error A2070:invalid instruction operands tmp32\sha1-586.asm(1576) : error A2070:invalid instruction operands NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 11.0 \VC\BIN\ml.EXE"' : return code […]