当前位置: 首页 > news >正文

nasm - console 32bits

文章目录

    • nasm - console 32bits
    • 概述
    • 笔记
    • my_build.bat
    • nasm_main.asm
    • 用VS2019写个程序,按照win32方式编译,比较一下。
    • 备注
    • END

nasm - console 32bits

概述

看到一个nasm的例子(用nasm实现一个32bits控制台的程序架子)
学习一下

笔记

my_build.bat

@echo off
rem my_build.batrem env
rem NASM version 2.16.03 compiled on Apr 17 2024
rem GoLink.Exe Version 1.0.4.6  Copyright Jeremy Gordon 2002-2025cls
set path=C:\Program Files\NASM;D:\my_dev\my_study_re\src\nasm\NasmX86AndX64ProgrammingExamples\tools\Golink;%path%rem .bat默认是不支持中文的
rem echo full path name - %~f0
rem echo full path      - %~dp0
rem echo file name      - %~nx0
rem echo work path      - %cd%if "%1" == "build" (goto build
) else if "%1" == "clear" (goto clear
) else (goto usage
):usage
echo usage my_build.bat [option]
echo build - build asm to EXE
echo clear - clear trush on the project
goto end:build
echo build ...rem find file on work path
if exist "nasm_main.obj"  (del "nasm_main.obj" 
) nasm -f win32 nasm_main.asm -o nasm_main.obj
rem 用IDA打开.obj 已经可以看到实现逻辑了if exist "console_win32.exe"  (del "console_win32.exe" 
) rem 如果不指定要连接的dll, 会报错
golink /entry:Start /console kernel32.dll nasm_main.obj /fo console_win32.exeif exist "console_win32.exe"  (echo run console_win32.exe console_win32.exe 
)
goto end:clear
echo clear ...
if exist "nasm_main.obj"  (del "nasm_main.obj" 
) if exist "console_win32.exe"  (del "console_win32.exe" 
)
goto end:end
echo END
rem pause
call cmd

nasm_main.asm

; @file nasm_main.asm
; @brief 用NASM实现一个32bits控制台程序NULL EQU 0
STD_OUTPUT_HANDLE EQU -11; 调用的win32API不用特意修饰, 用API的原始名称就行, 不必搞成 _WriteFile@20
extern GetStdHandle
extern WriteFile
extern ExitProcessglobal Startsection .dataMessage db "Console Message 32", 0x0D, 0x0AMessageLength EQU $-Messagesection .bssStandardHandle resd 1Written resd 1section .text
Start:push STD_OUTPUT_HANDLEcall GetStdHandlemov dword[StandardHandle], EAXpush NULLpush Writtenpush MessageLengthpush Messagepush dword[StandardHandle]call WriteFilepush NULL
call ExitProcess

用VS2019写个程序,按照win32方式编译,比较一下。


#include <Windows.h>int main()
{const char* pMsg = "Console Message 64 ...";DWORD NumberOfBytesWritten = 0;system("pause");HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);WriteFile(hStdOut, pMsg, strlen(pMsg), &NumberOfBytesWritten, NULL);ExitProcess(0);
}

然后单步调试,断住后,转到反汇编。比较了一下手写的NASM代码,发现基本和反汇编的结果一致。
NASM的语法和VS2019反汇编出来的代码几乎一模一样。

; @file nasm_main.asm
; @brief 用NASM实现一个32bits控制台程序NULL EQU 0
STD_OUTPUT_HANDLE EQU -11; 调用的win32API不用特意修饰, 用API的原始名称就行, 不必搞成 _WriteFile@20
extern GetStdHandle
extern WriteFile
extern ExitProcessglobal Startsection .dataMessage db "Console Message 32", 0x0D, 0x0AMessageLength EQU $-Messagesection .bssStandardHandle resd 1Written resd 1section .text
Start:; HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);; 00DB17D4  mov         esi,esp  ; 00DB17D6  push        0FFFFFFF5h // !; 00DB17D8  call        dword ptr [__imp__GetStdHandle@4 (0DBB000h)] // !  ; 00DB17DE  cmp         esi,esp  ; 00DB17E0  call        __RTC_CheckEsp (0DB1235h)  ; 00DB17E5  mov         dword ptr [hStdOut],eax // !push STD_OUTPUT_HANDLEcall GetStdHandlemov dword[StandardHandle], EAX; WriteFile(hStdOut, pMsg, strlen(pMsg), &NumberOfBytesWritten, NULL);; 00DB17E8  mov         esi,esp  ; 00DB17EA  push        0 // !; 00DB17EC  lea         eax,[NumberOfBytesWritten]  ; 00DB17EF  push        eax // !; 00DB17F0  mov         ecx,dword ptr [pMsg]  ; 00DB17F3  push        ecx // !; 00DB17F4  call        _strlen (0DB1366h)  ; 00DB17F9  add         esp,4  ; 00DB17FC  push        eax // ! ; 00DB17FD  mov         edx,dword ptr [pMsg]  ; 00DB1800  push        edx // ! ; 00DB1801  mov         eax,dword ptr [hStdOut]  ; 00DB1804  push        eax // ! ; 00DB1805  call        dword ptr [__imp__WriteFile@20 (0DBB004h)] // !; 00DB180B  cmp         esi,esp  ; 00DB180D  call        __RTC_CheckEsp (0DB1235h)  push NULLpush Writtenpush MessageLengthpush Messagepush dword[StandardHandle]call WriteFile; ExitProcess(0);; 00DB1812  mov         esi,esp  ; 00DB1814  push        0 // !; 00DB1816  call        dword ptr [__imp__ExitProcess@4 (0DBB008h)] // !; 00DB181C  cmp         esi,esp  ; 00DB181E  call        __RTC_CheckEsp (0DB1235h)  push NULLcall ExitProcess

备注

从VS2019 c++ console工程的代码和NASM例子代码比较,可以得到一个提示。
如果用NASM手写代码不太熟练,可以从VS2019 c++代码的反汇编代码抽取汇编代码,直接就能用在NASM工程上。

END

相关文章:

nasm - console 32bits

文章目录 nasm - console 32bits概述笔记my_build.batnasm_main.asm用VS2019写个程序&#xff0c;按照win32方式编译&#xff0c;比较一下。备注END nasm - console 32bits 概述 看到一个nasm的例子(用nasm实现一个32bits控制台的程序架子) 学习一下 笔记 my_build.bat ec…...

11.编写前端内容|vscode链接Linux|html|css|js(C++)

vscode链接服务器 安装VScode插件 Chinese (Simplified) (简体中⽂) Language Pack for Visual Studio CodeOpen in BrowserRemote SSH 在命令行输入 remote-ssh接着输入 打开配置文件&#xff0c;已经配置好主机 点击远程资源管理器可以找到 右键链接 输入密码 …...

【deepseek-r1模型】linux部署deepseek

1、快速安装 Ollama 下载&#xff1a;Download Ollama on macOS Ollama 官方主页&#xff1a;https://ollama.com Ollama 官方 GitHub 源代码仓库&#xff1a;https://github.com/ollama/ollama/ 官网提供了一条命令行快速安装的方法。 &#xff08;1&#xff09;下载Olla…...

【Github每日推荐】-- 2024 年项目汇总

1、AI 技术 项目简述OmniParser一款基于纯视觉的 GUI 智能体&#xff0c;能够准确识别界面上可交互图标以及理解截图中各元素语义&#xff0c;实现自动化界面交互场景&#xff0c;如自动化测试、自动化操作等。ChatTTS一款专门为对话场景设计的语音生成模型&#xff0c;主要用…...

C++中的.*运算符

看运算符重载的时候&#xff0c;看到这一句 .* :: sizeof ?: . 注意以上5个运算符不能重载。 :: sizeof ?: . 这四个好理解&#xff0c;毕竟都学过&#xff0c;但.*是什么&#xff1f; 于是自己整理了一下 .* 是一种 C 中的运算符&#xff0c;称为指针到成…...

深度学习笔记——LSTM

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍面试过程中可能遇到的LSTM知识点。 文章目录 LSTM&#xff08;Long Short-Term Memory&#xff09;LSTM 的核心部件LSTM 的公式和工作原理(1) 遗忘门&a…...

spring boot知识点2

1.spring boot 要开启一些特性&#xff0c;可通过什么方式开启 a.通过Enable注解&#xff0c;可启动定时服务 b.通过application.properties可设置端口号等地址信息 2.什么是热部署&#xff0c;以及spring boot通过什么方式进行热部署 热部署这个概念&#xff0c;我知道。就…...

【机器学习】CNN与Transformer的表面区别与本质区别

仅供参考 表面区别 1. 结构和原理: CNN:主要通过卷积层来提取特征,这些层通过滑动窗口(卷积核)捕捉局部特征,并通过池化层(如最大池化)来降低特征的空间维度。CNN非常适合处理具有网格状拓扑结构的数据,如图像。Transformer:基于自注意力(Self-Attention)机制,能…...

框架篇 - Hearth ArcGIS 框架扩展(DryIoC、Options、Nlog...)

框架篇 - Hearth ArcGISPro Addin 框架扩展(DryIoC、Options、Nlog…) 文章目录 框架篇 - Hearth ArcGISPro Addin 框架扩展(DryIoC、Options、Nlog...)1 使用IoC、DI1.1 服务注册1.1.1 `ServiceAttribute`服务特性1.2 依赖注入1.2.1 SDK底层创建实例类型依赖注入1.2.2 `In…...

JUC并发—7.AQS源码分析三

大纲 1.等待多线程完成的CountDownLatch介绍 2.CountDownLatch.await()方法源码 3.CountDownLatch.coutDown()方法源码 4.CountDownLatch总结 5.控制并发线程数的Semaphore介绍 6.Semaphore的令牌获取过程 7.Semaphore的令牌释放过程 8.同步屏障CyclicBarrier介绍 9.C…...

windows系统本地部署DeepSeek-R1全流程指南:Ollama+Docker+OpenWebUI

本文将手把手教您使用OllamaDockerOpenWebUI三件套在本地部署DeepSeek-R1大语言模型&#xff0c;实现私有化AI服务搭建。 一、环境准备 1.1 硬件要求 CPU&#xff1a;推荐Intel i7及以上&#xff08;需支持AVX2指令集&#xff09; 内存&#xff1a;最低16GB&#xff0c;推荐…...

当C#邂逅Deepseek, 或.net界面集成deepseek

最近&#xff0c;我开发了一个C#界面&#xff0c;并集成了Deepseek的接口功能&#xff0c;实现了本地化部署和流模式读取。 过程充满了挑战和乐趣&#xff0c;也让我深刻体会到Deepseek的强大之处。今天&#xff0c;我想和大家分享这段经历&#xff0c;希望能激发你对Deepseek的…...

Cursor实战:Web版背单词应用开发演示

Cursor实战&#xff1a;Web版背单词应用开发演示 需求分析自行编写需求文档借助Cursor生成需求文档 前端UI设计后端开发项目结构环境参数数据库设计安装Python依赖运行应用 前端代码修改测试前端界面 测试数据生成功能测试Bug修复 总结 在上一篇《Cursor AI编程助手不完全指南》…...

Kotlin Lambda

Kotlin Lambda 在探索Kotlin Lambda之前&#xff0c;我们先回顾下Java中的Lambda表达式&#xff0c;Java 的 Lambda 表达式是 Java 8 引入的一项强大的功能&#xff0c;它使得函数式编程风格的代码更加简洁和易于理解。Lambda 表达式允许你以一种更简洁的方式表示实现接口&…...

V4L2驱动之UVC

以下是关于V4L2摄像头驱动框架与UVC协议的关联分析&#xff0c;从内核驱动到用户空间的完整视角&#xff1a; 1. V4L2驱动框架核心架构 关键组件&#xff1a; 核心层 (V4L2 Core) v4l2_device&#xff1a;设备的总入口&#xff0c;管理所有子组件video_device&#xff1a;对应…...

numpy(01 入门)

前面内容&#xff1a;pandas(01 入门) 目录 一、numpy 简介 1.1 Numpy 应用场景 1.2 Numpy 优点 1.3 Numpy 缺点 1.4 相关链接 二、Numpy环境安装配置 2.1 Python自带包 2.2 Numpy 安装 三、NumPy.Ndarray 3.1 ndarray特点&#xff1a; 3.2 ndarray()参数&…...

Chatgpt论文润色指令整理

1. 内容润色 这个来自文章《three ways ChatGPT helps me in my academic writing》。 在输入你要润色的内容前&#xff0c;先输入以下内容来驯化chatgpt的身份&#xff1a; I’m writing a paper on [话题] for a leading [学科/杂志] academic journal. What I tried to s…...

vscode复制到下一行

linux中默认快捷键是ctrl shift alt down/up 但是在vscode中无法使用&#xff0c;应该是被其他的东西绑定了&#xff0c;经测试&#xff0c;可以使用windows下的快捷键shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…...

Python天梯赛刷题-五分题(上)

蓝桥杯题刷的好累&#xff0c;感觉零帧起手、以题带学真的会很吃力&#xff0c;打算重新刷一点天梯的题目巩固一下&#xff0c;我本人在算法非常不精通的情况下&#xff0c;自认为天梯的L1的题是会相对容易一些的&#xff0c;可能有一些没有脑子光靠力气的“硬推”hhhh。 从头…...

【优先级队列】任务分配

任务分配问题&#xff0c;有n个任务&#xff0c;每个任务有个达到时间。将这些任务分配给m个处理器&#xff0c;进行处理。每个处理器的处理时间不一样。处理器的任务列表有最大任务数限制。 分配任务的策略是&#xff1a;当前待分配的任务的处理时刻最小。如果处理时刻相同&am…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…...

Flask和Django,你怎么选?

Flask 和 Django 是 Python 两大最流行的 Web 框架&#xff0c;但它们的设计哲学、目标和适用场景有显著区别。以下是详细的对比&#xff1a; 核心区别&#xff1a;哲学与定位 Django: 定位: "全栈式" Web 框架。奉行"开箱即用"的理念。 哲学: "包含…...