Articles of nasm

Windows ASM printf与浮动

我一直试图在汇编程序中与Windows中的标准C库进行接口,我遇到了麻烦。 出于某种原因,我不能让printf接受浮点variables,所以这里有些问题。 这是我可以创build的最短程序来演示问题。 我已经包含了一些解释我理解应该发生的事情的评论。 谢谢 ; ; Hello64.asm ; A simple program to print a floating point number in windows ; ; assemble: nasm float64.asm -f win64 ; link: golink /console /entry main float64.obj MSVCRT.dll ; ; tell assembler to generate 64-bit code ; bits 64 ; data segment section .data use64 pi dq 3.14159 […]

在NASM中使用DB指令可以在.text段中创build可写variables吗?

我试过使用例如file_handle: dd 0在.text段中声明variables。 但是,试图在mov [file_handle], eax这个variables中存储一些东西mov [file_handle], eax导致写入错误。 我知道,我可以在.data段中声明可写variables,但为了使代码更紧凑,我想按照上面的方法来尝试。 是唯一的可能性使用堆栈来存储这些值(例如文件句柄),或者我可以以某种方式写入我的variables上面?

NASM教程使用int 80h,但这不适用于Windows

完成FASM后,我开始NASM汇编。 我正在Windows操作系统中编码。 我的代码如下: section.data ;Constant msg: db "Hello World!" msg_L: equ $-msg ; Current – msg1 section.bss ;Varialble section.text ; Code global _WinMain@16 _WinMain@16: mov eax,4 mov ebx,1; Where to wrte it out. Terminal mov ecx, msg mov edx, msg_L int 80h mov eax, 1 ; EXIT COMMAND mov ebx,0 ; No Eror int 80h […]

如何在DOS中显示汇编中的字符?

我有以下代码,我试图显示,但我的debugging器(AFD)不断debugging,但不显示任何东西。 [org 0x100] mov ax, 0xb800 mov es, ax mov di, 0 nextchar: mov word [es:di], 0x0720 add di, 2 cmp di, 40 jne nextchar mov ax,0x0003 ; 80×25 text mode, 16 colors int 0x10

如何组装和链接.asm文件到Win32可执行文件?

我的系统上安装了NASM和Dev-Cpp 。 Dev-cpp带有LD (GNU Linker)。 我是新来的汇编代码和从汇编程序文件创build一个32位Windows可执行文件的过程。 我试着用这个: nasm -f win32 ass.asm nasm -o ass ass.o 我没有成功使用这些命令来创build一个可执行文件。 什么是正确的方式来组装(与NASM )和链接来生成将在32位Windows上运行的可执行文件?

组装linux系统调用分段错误

我正在试验,并有以下汇编代码,除非在程序结束之前出现“分段错误(核心转储)”消息,否则工作得很好。 GLOBAL _start %define ___STDIN 0 %define ___STDOUT 1 %define ___SYSCALL_WRITE 0x04 segment .data segment .rodata L1 db "hello World", 10, 0 segment .bss segment .text _start: mov eax, ___SYSCALL_WRITE mov ebx, ___STDOUT mov ecx, L1 mov edx, 13 int 0x80 最后我是不是也没关系; 我仍然收到消息。 有什么问题? 我使用的是x86和nasm。

linux nasm程序集打印从零到100的所有数字

我正在编写一个程序来打印出从零到100的所有数字。我这样做的唯一原因是testing打印出多个数字。 我遇到的问题是我的程序只打印出数字1和2.我不知道为什么。 我的编译器编译得很好,没有错误,也没有链接器错误。 这是我的代码: SECTION .data len EQU 32 NUL EQU 0 countlen EQU 8 SECTION .bss counter resb countlen strlen resb countlen SECTION .text GLOBAL _start _start: mov BYTE[counter], 1 ; set counter to 1 mov BYTE[strlen], 1 ; set string length counter to 1 mov ecx, counter ; move the counter to ecx […]

为什么printf覆盖ECX寄存器?

我知道printf返回EAX中打印的字符数。 为什么printf将寄存器ECX更改为0? 我的代码片段: push eax push intFormat call printf add esp,8 我在64位Linux发行版上运行我的代码。

为什么数据和堆栈段是可执行的?

我刚刚注意到,我的简单程序的数据和堆栈段可执行。 我在/ proc / [pid] / maps中看到了,简单的代码证实了它。 例如: ; prog.asm section .data code: db 0xCC ;int3 section .text global _start _start: jmp code mov rax, 60 ; sys_exit mov rdi, 0 syscall 然后 nasm -f elf64 prog.asm ld -o prog prog.o ./prog 导致prog执行int3指令。 用C编写的,用gcc构build的程序的数据,堆栈和堆是不可执行的,那么为什么写在汇编中的程序却以不同的方式运行呢?

尝试使用纯Win64 API从x64汇编器读取控制台input(无C运行时)

我只是学习x64汇编,而我刚遇到一个我不能解释的问题。 从Kernel32.dll的ReadFile如何从C代码工作,我期待它停止在控制台,并等待我input一个完整的行之前返回给调用者,这令人惊讶的是根本不工作。 ReadFile过程似乎返回一个零长度的string,无论键盘上按下什么,或者是从命令shell的pipe道传递给它的东西。 ;%USERPROFILE%\nasm\learning\stdio.asm ; ;Basic usage of the standard input/output/error channels. ; ;nasm -f win64 stdio.asm ;golink /console /ni /entry main stdio.obj kernel32.dll %include "\inc\nasmx.inc" %include "\inc\win32\windows.inc" %include "\inc\win32\kernel32.inc" %ifidn __BITS__, 0x40 ;// assert: set call stack for procedure prolog to max ;// invoke param bytes for 64-bit assembly mode DEFAULT REL NASMX_PRAGMA CALLSTACK, […]