x86 masm 你好世界

2023-12-01

我正在尝试使用 VS 2010 附带的 ML 和 LINK 在 Windows 上编译一个 hello world。

.MODEL FLAT
.STACK 4096
.data
msg db "Hello World!",0
.code
INCLUDELIB MSVCRT
EXTRN printf:NEAR
EXTRN exit:NEAR
PUBLIC _main
_main PROC
mov eax, offset msg
push eax
call printf
mov eax,0
push eax
call exit
_main ENDP
END _main

我不断收到链接器错误,指出 printf 和 exit 是未解析的外部符号。我有一些问题。

  1. ML 和 LINK 可以使用哪些命令行选项来编译和解决错误消息。
  2. 是否有另一种方法可以使用汇编代码将文本输出显示到屏幕,而不是调用 printf 等 C 运行时函数?

  1. 您需要对 C 函数使用下划线名称,因为这就是编译器在汇编时发出它们的方式 等级。
  2. 您应该在调用 printf 和其他 CRT 函数后清理堆栈,因为它们使用 cdecl 调用约定(调用者堆栈清理)。严格来说,您也应该在 _exit 之后执行此操作,但这不太重要,因为它永远不会返回。
  3. 要使用 CRT 函数,您必须初始化 CRT。您可以在文件中检查它是如何完成的VC\crt\src\crt0.c

这是一个对我有用的最小文件(我使用静态库,因为我有 VS2008 并且不想摆弄清单以使其与 DLL 一起工作)。

.386
.MODEL FLAT
.STACK 4096
.data
  msg db "Hello World!",0
.code
INCLUDELIB LIBCMT
EXTRN _printf:NEAR
EXTRN _exit:NEAR
EXTRN __heap_init:NEAR
EXTRN __mtinit:NEAR
EXTRN __ioinit:NEAR
PUBLIC _main
_main PROC
  push 1
  call __heap_init
  add esp, 4
  push 1
  call __mtinit
  add esp, 4
  call __ioinit
  mov eax, offset msg
  push eax
  call _printf
  pop ecx
  mov eax,0
  push eax
  call _exit
_main ENDP
END _main

对于 MSVCRT 来说,初始化是不同的,例如你需要调用set_app_type

为了不依赖 CRT,您必须使用操作系统 API。对于 Win32,这将是 Win32 函数,例如 WriteFile(使用 GetStdHandle(STD_OUTPUT_HANDLE) 作为文件句柄)。查看一些示例here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86 masm 你好世界 的相关文章

  • 使用 gdb 调试反汇编库

    在Linux和Mac OS X中可以使用strapi和next来调试应用程序而无需调试信息 在 Mac OS X 上 gdb 显示在库内部调用的函数 尽管有时会在每个 stepi 指令中推进多个汇编程序指令 在 Linux 上 当我进入动态
  • 编写 AMD64 SysV 程序集时使用哪些寄存器作为临时寄存器?

    我正在使用实现一个功能cpuid根据 AMD64 SysV ABI 进行组装 我需要在函数本身中使用 2 个临时寄存器 第一个用于累积返回值 第二个用作计数器 我的功能目前如下所示 zero argument function some c
  • 计算链接上的点击次数(不带 onclick)[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有诸如此类的链接 a href h
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • 如何让c代码执行hex机器代码?

    我想要一个简单的 C 方法能够在 Linux 64 位机器上运行十六进制字节码 这是我的 C 程序 char code x48 x31 xc0 include
  • CALL指令是否总是将EIP指向的地址压入堆栈?

    x86架构中函数调用时是否存在返回地址不入栈的情况 No CALL根据定义 将在跳转到目标地址之前将返回地址压入堆栈 该返回地址是EIP or RIP sizeof call instruction 通常为 5 个字节 英特尔 64 和 I
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 如何检测链接是否有效?

    我需要知道链接是否会打开 See 马克西米利安 霍夫曼的回答 https stackoverflow com a 29525678 1445366以获得更强大的解决方案 像这样的方法很常见 劫持超时以重定向到不同的 URL 这种方法对你有用
  • 为什么x86分页没有特权环的概念?

    早在 1982 年 当 Intel 发布 80286 时 他们在分段方案中添加了 4 个特权级别 环 0 3 由全局描述符表 GDT 和局部描述符表 LDT 中的 2 位指定 在 80386 处理器中 Intel 添加了分页功能 但令人惊讶
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 用于预乘 ARGB 的 SSE alpha 混合

    我正在尝试编写一个支持 SSE 的 alpha 合成器 这就是我想出的 首先 混合两个 4 像素向量的代码 alpha blend two 128 bit 16 byte SSE vectors containing 4 pre multi
  • 如何在 Linux x86_64 上模拟 iret

    我正在编写一个基于 Intel VT 的调试器 由于当 NMI Exiting 1 时 iret 指令在 vmx guest 中的性能发生了变化 所以我应该自己处理vmx主机中的NMI 否则 guest会出现nmi可重入错误 我查了英特尔手
  • 添加链接以在 Google 文档中打开本地文件

    我已经制作了有关我的工具的指南 或类似教程的内容 以与我的公司分享 我使用 Google 文档来做到这一点 并且我想添加打开视频指南的链接 我想知道一种在文档中添加链接的方法 我所做的如下 工作表 或您的文档 中的链接仅响应互联网协议 例如
  • 如果执行了锚点 href 链接,则禁用 onClick 事件

    我有一张桌子 每一行都是一个由 js 调用的某个页面 例如 google com 的链接 onClick window open 方法 tr class tr 在最后一栏中我有一个锚点链接链接到其他页面 例如 jsfiddle td cla
  • 这种没有推送寄存器的交换有多安全?

    我对汇编非常陌生 下面的代码应该通过两个不同的函数交换两个整数 首先使用swap c然后使用swap asm 但我怀疑 我是否需要push 我的意思是保存 汇编代码之前寄存器的每个值和pop稍后 就在返回之前 main 换句话说 如果我返回
  • SIMD 和 VLIW 指令是一样的吗?

    SIMD 单指令多数据 和 VLIW 超长指令字 到底有什么区别 其中一个是另一个的子集吗 或者它们是两个完全不同的东西 完全不相关且正交 一台机器可以有一个或两个 或者两者都没有 SIMD 指令可以作为扩展添加到 VLIW ISA 但 V
  • 如何在asp.net mvc中创建弹出窗口?

    无需使用 javascript AJAX 单击超链接时 应该打开一个新的浏览器窗口 基本 HTML 锚元素 a href http www w3schools com target blank Visit W3Schools a ASP N
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • Jquery:将链接标记为已访问而不打开它们?

    我无意仅仅更改链接 我听说这是不可能的 但如果不是 我很想知道如何更改 如果需要的话 我可以将其添加到浏览器历史记录中 我想遍历所有 a 位于页面上并将其状态更改为已访问 例如 a each function mark as visited

随机推荐

  • 用于查找 C# 类和方法名称的正则表达式

    我正在编写一个影响分析工具 它将解析一堆选定的文件类型并查找文件 在本例中为 cs 文件 内的类和方法调用 我已经成功编写了一个正则表达式 可以查找一行代码是否是方法调用 Regex re new Regex b public privat
  • 为什么Java中对象的Hashcode会改变?

    为什么Java中对象的Hashcode会改变 它有什么变化吗 它与哈希表有什么关系 每个对象都应该有它唯一的哈希码 那么 重新哈希是其原因吗 提前致谢 The defaulthashcode的实现相当于对象标识 但是 某些对象会覆盖哈希码
  • 将图像叠加到相机预览 SurfaceView 上

    我有一个SurfaceView它被用来绘制图像 我想将它们叠加到手机相机的实时反馈上 目前 SurfaceView包含图像的图像具有白色背景 但如果我要将它们覆盖到手机的相机画面上 它们必须是透明的 相机和动画绘制不能同时完成Surface
  • Xamarin iOS IPv6 应用商店拒绝

    我们一直在构建一个关于客户端 服务器应用程序的 iOS 应用程序 我们在 iOS 应用程序中通过 Xamarin 使用 SQL 连接和 WCF Web 服务 SQL连接代码 String ips 10 0 0 1 Example SqlCo
  • 连接 SQLite 数据库失败

    我正在尝试在 Java Applet 中访问我的 SQLite3 数据库 当我运行代码来连接到数据库时 出现此错误没有找到适合 a db 的驱动程序 我该如何修复它 现在我不完全确定我实际上已经安装了正确的驱动程序 我会告诉你我做了什么 你
  • 如何使用 DataTemplate + 触发器在视图之间切换

    我有一个要求 其中用户可以切换以树或数据网格中的文本或流程图的形式查看分层数据 用户可以通过单击切换按钮来完成此操作 该按钮显示 切换模式 我希望以这样一种方式来完成这一切 即它只能在视图中处理 因为所有三种情况下的 ViewModel 都
  • 使用php sdk扩展权限

    我正在使用 php sdk 开发 Facebook 应用程序 我想从我的应用程序的用户那里获取一些扩展权限 由于这是用户登录 Facebook 后进入的应用程序 那么当用户访问我的页面时我如何获得扩展权限 我们无法放置可以获取权限的登录按钮
  • jOOQ不生成源

    我试图将 jOOQ 包含到我的代码中 但是没有生成任何代码 执行时mvn clean generate sources 不生成任何源 我希望它创建一个Category类 其定义如下schema sql file CREATE TABLE I
  • Java 原始数据膨胀异常

    我试图在 java 中解码 JWT 有效负载 但该有效负载被压缩 放气 zip DEF java util zip DataFormatException 标头检查不正确 private static byte decompress byt
  • 空手道 - 如何从单个主要功能调用多个外部功能

    Feature Principal feature Background url http example com Scenario Feature calling def inputTable call read input table
  • LDAP 的连接字符串是什么?

    这是我需要如何使用它 string tmpDirectory String Format LDAP ou 0 dc 1 dc 2 parentOrganizationUnit domainName domainExtension 当我尝试使
  • 如何创建一个可以将按键发送到控件而不窃取焦点的按钮 - 虚拟键盘

    如何制作一个可以将键发送到 datagridview 的按钮 因此我需要以某种方式将 datagridview 返回到其失去焦点之前的状态 我来解释一下问题 我有一个带有 datagridview 和一些按钮的表单 我可以点击按钮 它会输入
  • 防止conda自动降级python包

    I had problems with pandas datareader软件包 v0 8 1 为了解决我的问题 我必须通过运行以下命令将软件包升级到较新的版本 0 9 conda install c anaconda pandas dat
  • 启用禁用表格行中的控件

    我想在选中相应的 chkView 时启用该行的编辑和删除复选框 如果未选中则禁用它们 这段代码一开始根本就没有触发 我哪里错了 http jsfiddle net 75rVH 1 HTML table tr td td tr table
  • 将 ifelse 函数应用于系统发育扇的颜色提示

    作为系统发育爱好者 我想通过应用 if 语句对提示 类似于本例中的 62 个物种 进行颜色编码 我目前正在使用以下代码 试图将与 O 相关的所有物种着色为深绿色 ColourIf ifelse LU O blue darkgreen tif
  • 检测另一个进程的位数(在 Windows 中)

    如何检测 Windows 中是否有另一个进程以 32 64 位运行 我知道如何为我自己的流程执行此操作 但不知道如何为不同的流程执行此操作 任何语言的提示或解决方案都可以 谢谢 查看是Wow64进程
  • 将列表运算符“in”与浮点值一起使用

    我有一个包含浮点数的列表 每个数字有 3 位小数 例如 474 259 如果我像这样验证列表中的号码 if 474 259 in list sample print something 然后显示消息 但如果我从另一个列表中取出数字并将其四舍
  • clojure 宏生成函数

    我正在尝试编写一个将生成 n 个函数的宏 这是我到目前为止所拥有的 only defined this because if I inline this into make placeholders it s unable to expan
  • 如何从 java 程序运行 mvn 命令?

    我正在构建一个 Java 程序 用于在服务器端自动执行一个过程 通常我 cd 到 Desktop GIT 并使用此 Maven 命令 mvn Integration test DskipTests P Interactive e 我正在构建
  • x86 masm 你好世界

    我正在尝试使用 VS 2010 附带的 ML 和 LINK 在 Windows 上编译一个 hello world MODEL FLAT STACK 4096 data msg db Hello World 0 code INCLUDELI