草庐IT

windows - 在 Windows XP 中使用 NASM 编程

我有以下代码可以在WindowsXP32位2.09.08NASM上正常组装和运行:;howtocompile:nasm-felftest.asm;howtolink:ld-otest.exetest.osection.datasection.text;global_WinMain@16;_WinMain@16:;global_start_start:movax,4jmp$根据许多关于NASM的教程,asm文件需要包含以下内容:global_WinMain@16_WinMain@16:...如您所见,我的asm文件中没有它。(它被注释掉了,Allithasis_start)。那么,当我的

windows - call immediate 与 call dword near [dword addr]

所以最近我一直想从汇编中调用一些win32调用,并且我一直在使用NASM作为我的外部汇编程序。我调用SendMessage在我的代码中以下列方式:call__imp__SendMessageW@16这被组装成一个相对跳转(0xE8操作码),结果是访问冲突。在调试器中,计算出的跳转偏移似乎是正确的(因为__imp__SendMessageW@16似乎确实驻留在那儿)但它仍然不起作用。当我从C++调用函数时检查VisualStudio生成的程序集,我注意到它不是使用相对直接跳转,而是(用MASM的语言)calldwordptr[__imp__SendMessageW@16],对应于0xFF

windows - NASM ReadConsoleA 或 WriteConsoleA 缓冲区调试问题

我正在Windows上编写一个NASM汇编程序,让用户输入两个单位数字,将它们相加,然后输出结果。我正在尝试使用WindowsAPI进行输入和输出。不幸的是,虽然我可以让它在程序循环后立即读取一个数字以获得第二个值,但程序结束而不是要求第二个值。程序的输出如下所示:有趣的是,如果我输入1,那么显示的值会大一个,所以它正在添加一些东西!这也适用于输入的其他个位数(2-9)。我很确定这与我使用ReadConsoleA函数的方式有关,但我在尝试寻找解决方案时遇到了一些障碍。我安装了gdb来调试程序,组装如下:nasm-fwin64-g-otask9.objtask9.asmGoLink/co

windows - 如何索引 malloc 的缓冲区和输出

参见fullcodehere.我已经用fread调用填充了一个缓冲区(malloc'd)并且它是成功的。我现在正在尝试遍历缓冲区并开始解析输入。我试图通过遍历缓冲区并将每个字符输出到屏幕来开始非常简单。但是我的循环只是输出整个输入。这是代码的循环部分:movecx,0movebx,buffer.readByte:pushDWORD[ebx+1*ecx]pushDWORDecxpushDWORDcharcall_printfaddesp,12increcxcmpecx,[fsz]jge.endReadjmp.readByte读入(s1.txt)的源文件内容为:1+2;我的目标是简单地输出

windows - 在调用 asm 函数之前在 C 中调用 printf 或不调用的神秘副作用?

此程序必须根据用户提供的精度计算圆周率。calculate_pi()函数是用NASM写的。有人可以向我解释为什么如果评论此行://printf("accuracy:%.15f\n",precision);//程序无法正常运行。向calcuta_pi()函数发送奇怪的数字?如果注释掉这一行,就会向函数发送一个非常小的值,程序将无限运行。但如果不是注释程序,则它可以正常工作。#include#includeexterndoublecalculate_pi(doubleprecision);/*externalfunctiondeclaration*/doublecalculate_pi(d

windows - Windows 8 x64 上的汇编代码

我是硬件方面的新手,接近使用汇编代码编程。所以我读了一本关于它的书并找到了NASM汇编程序的示例代码:segment.text;codesegmentglobalmain;mustbedeclaredforlinkermain:;telllinkerentrypointmovedx,len;messagelengthmovecx,msg;messagetowritemovebx,1;filedescriptor(stdout)moveax,4;systemcallnumber(sys_write)int0x80;callkernelmoveax,1;systemcallnumber(s

windows - 如何在程序集中正确调用 64 位 Windows API

使用NASM和Mingw-w64我一直在尝试运行以下程序,该程序应该使用WindowsAPI将消息打印到屏幕上。它运行,但控制台上没有显示任何内容,并导致对内存位置的访问无效(错误代码0x3e6h)。为什么会这样,我怎样才能让程序正常运行?globalmainexternExitProcessexternGetStdHandleexternWriteFilesection.textmain:movrcx,0fffffff5hcallGetStdHandlemovrcx,raxmovrdx,NtlpBuffermovr8,NtnNBytesToWritemovr9,NtlpNBytesW

windows - Windows 8.1 64 位的 NASM 问题

我现在在让NASM工作时遇到了一些问题。我必须为我在大学学习的科目安装它。我安装了Windows8.1Pro64位。我设法通过下载最新版本安装了NASM。我们的第一个任务就是将代码复制到HelloWorld程序并让它运行。下面是代码:bits16org0x100;Starttheprogramatoffset100hjmpmain;Jumptomainprogrammessage:db'HelloWorld',0ah,0dh,'$'main:movdx,message;Startaddressofmessagemovah,09;Prepareforscreendisplayint21h

Windows 强制执行 READ-ONLY .text 部分,即使被 ld 链接器禁用

在下面的玩具程序中,我在.text部分声明了一个变量并写入它,这给出了一个段错误,因为.text部分被标记为只读:Breakpoint1,0x00401000instart()(gdb)disassembleDumpofassemblercodeforfunctionstart:=>0x00401000:movl$0x2,0x40100aEndofassemblerdump.(gdb)stepiProgramreceivedsignalSIGSEGV,Segmentationfault.0x00401000instart()(gdb)这是objdump输出:test.exe:filef

windows - 在 NASM 中导入不起作用?

我正在尝试在Windows7(使用NASM)上编译以下代码:[BITS32]externExitProcessimportExitProcesskernel32.dllexternMessageBoxAimportMessageBoxAuser32.dllsegment.datause32Captiondb'CaptionText',0Textdb"MyMessageBoxText.",0segment.codeuse32..start:pushdword0pushdwordCaptionpushdwordTextpushdword0call[MessageBoxA]pushdword