Articles of nasm

在Windows下的NASM,Hello World的例子比较

这两个例子是一样的,他们只是打印一个"Hello, World!" 信息: 例1: global _main extern _printf section .text _main: push message call _printf add esp, 4 ret message: db "Hello, World!", 13, 10, 0 这是命令行: nasm -fwin32 0.asm gcc 0.obj 例2: global _main extern _ExitProcess@4, _printf section .text _main: push message call _printf add esp, 4 push 0 call _ExitProcess@4 message: db "Hello, […]

在Windows XP中使用NASM编程

我有以下代码组装并运行在Windows XP 32位,2.09.08 NASM: ; how to compile: nasm -f elf test.asm ; how to link: ld -o test.exe test.o section .data section .text ;global _WinMain@16 ;_WinMain@16: ;global _start _start: mov ax,4 jmp $ 根据NASM上的许多教程,asm文件需要以下内容: global _WinMain@16 _WinMain@16: … 正如你可以看到我的asm文件没有它。 (它被注释掉,它只有_start)。 那么当我的汇编程序没有这个function并且工作的时候,所有这些教程都提到了全局_WinMain @ 16的必要性。 这是组装的命令:nasm -f elf test.asm 这是链接的命令:ld -o test.exe test.o

NASM ReadConsoleA或WriteConsoleA缓冲区debugging问题

我正在Windows上编写一个NASM汇编程序,让用户input两个单独的数字,将它们相加,然后输出结果。 我正在尝试使用Windows API进行input和输出。 不幸的是,尽pipe程序循环一次就可以读取一个数字,第二个程序结束而不是要求第二个数值。 程序的输出如下图所示: 有趣的是,如果我input1那么显示的值是一个更大,所以它是添加到一些东西! 这也适用于input的其他单个数字( 2-9 )。 我非常确定这与我如何使用ReadConsoleA函数有关,但是我试图find一个解决scheme。 我已经安装了gdb来debugging程序并按如下方式组装它: nasm -f win64 -g -o task9.obj task9.asm GoLink /console /entry _main task9.obj kernel32.dll gdb task9 但我只是得到以下错误: "C:\Users\Administrator\Desktop/task9.exe": not in executable format: File format not recognized 我从那以后读了NASM不输出Win64格式需要的debugging信息,但是我不是100%确定的。 我确信我已经安装了64位版本的GDB: 我的程序如下: extern ExitProcess ;windows API function to exit process extern WriteConsoleA ;windows API function to write to […]

如何索引malloc'd缓冲区和输出

在这里看完整的代码 。 我用fread调用了一个缓冲区(malloc'd),这是成功的。 我现在试图迭代缓冲区并开始parsinginput。 我试图通过走缓冲区并输出每个字符到屏幕来开始非常简单。 但我的循环只是输出整个input。 这里是代码的循环部分: mov ecx, 0 mov ebx, buffer .readByte: push DWORD [ebx + 1 * ecx] push DWORD ecx push DWORD char call _printf add esp, 12 incr ecx cmp ecx, [fsz] jge .endRead jmp .readByte 在(s1.txt)中读入的源文件的内容是: 1 + 2; 我的目标是简单地输出: 1 + 2 ;

如何在NASM中添加两个数字,整数和浮点数?

我有这个代码是假设添加两个数字,一个浮点数(3.25)和一个整数(2)。 编辑: extern _printf, _scanf global _main section .bss num1: resb 4 section .data format_num: db "%f", 10, 0 section .text _main: mov dword [num1], __float32__(3.25) add num1, 2 sub esp, 8 fld dword [num1] mov dword [num1], eax fstp qword [esp] push format_num call _printf add esp, 12 ret 我得到的输出是: test.asm:11:错误:操作码和操作数无效组合 我期望的结果是: 5.250000

汇编代码在Windows 8 x64上

我刚接触使用汇编代码编程的硬件。 所以我读了一本关于它的书,并find了NASM汇编程序的示例代码: segment .text ;code segment global main ;must be declared for linker main: ;tell linker entry point mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel segment .data ;data […]

如何在汇编中正确调用64位Windows API

使用NASM和Mingw-w64我一直在试图运行下面的程序,它应该使用Windows API将消息打印到屏幕上。 它运行,但没有显示在控制台上,并导致对内存位置的无效访问(错误代码0x3e6h)。 为什么是这样,我怎样才能让程序正常运行? global main extern ExitProcess extern GetStdHandle extern WriteFile section .text main: mov rcx, 0fffffff5h call GetStdHandle mov rcx, rax mov rdx, NtlpBuffer mov r8, NtnNBytesToWrite mov r9, NtlpNBytesWritten mov dword [rsp – 04h], 00h call WriteFile ExitProgram: mov rcx, 00h call ExitProcess section .data NtlpBuffer: db 'Hello, World!', 00h NtnNBytesToWrite: dd […]

与Windows 8.1 64位的NASM麻烦

我现在在使NASM工作时遇到一些麻烦。 我必须把它安装成我在大学时所学的科目。 我有Windows 8.1 Pro 64位安装。 我设法通过下载最新版本来安装NASM。 我们的第一个任务是将代码复制到一个Hello World程序并让它运行。 以下是代码: bits 16 org 0x100 ; Start the program at offset 100h jmp main ; Jump to main program message: db 'Hello World', 0ah, 0dh, '$' main: mov dx, message ; Start address of message mov ah, 09 ; Prepare for screen display int 21h ; […]

ld MinGW链接到标准的C库

我有以下代码的问题。 extern printf global _main main: push msg call printf ret msg db "Hello world",0 我使用nasm -fwin32 test.asm与NASM进行汇编,然后使用ld test.obj将其链接起来。 它告诉我“ test.obj:test.asm:(text+0x6): undefined reference to 'printf' ” 如何将我的文件链接到标准C库? 我有最新的MinGW。

Windows强制执行READ-ONLY .text部分,甚至因此被ld链接器禁用

在下面的玩具程序中,我在.text部分声明了一个variables并写入它,由于.text部分被标记为READ-ONLY,所以给出了分段错误: Breakpoint 1, 0x00401000 in start () (gdb) disassemble Dump of assembler code for function start: => 0x00401000 <+0>: movl $0x2,0x40100a End of assembler dump. (gdb) stepi Program received signal SIGSEGV, Segmentation fault. 0x00401000 in start () (gdb) 这里是objdump输出: test.exe: file format pei-i386 Sections: Idx Name Size VMA LMA File off Algn 0 .text 0000001f […]