assembly - 用于在 masm 中打印数字的 OFFSET 关键字

标签 assembly x86 masm inline-assembly

我使用 MSVC 内联汇编编写代码,其中我使用偏移量通过 printf 打印字符数组。它工作正常。

#include <iostream>
using namespace std;
char FORMAT[] = "%s %s %s %s, %s\n";
char SURNAME[] = "Ponomarenko";
char NAME[] = "Maria";
char DESIGN[] = "Design";
char BY[] = "by";
char YEAR[] = "2020";
int YEAR1 = 2020;

void main() {
__asm { 
    mov eax, offset YEAR
    push eax
    mov eax, offset SURNAME
    push eax
    mov eax, offset NAME
    push eax
    mov eax, offset BY
    push eax
    mov eax, offset DESIGN
    push eax
    mov eax, offset FORMAT
    push eax
    mov edi, printf
    call edi

    pop ebx
    pop ebx
    pop ebx
    pop ebx
    pop ebx
} 
system("pause");
} 

比起我尝试打印数字 YEAR1,我试过这个

mov eax, offset YEAR1
    push eax

结果很奇怪,然后我没有偏移地写了,它成功了! (当然,在这两种情况下,我都更改了我的 FORMAT 数组)

mov eax, YEAR1
    push eax

您能解释一下为什么胶印会以这种方式影响打印数字吗?

最佳答案

在 visual studio 中,microsoft assembler (MASM) 用于 offset 加载变量的地址,而不是值本身,您可以使用 offset 来调用函数但不加载值。

请使用此链接作为引用: http://www.asmcommunity.net/forums/topic/?id=15124

关于assembly - 用于在 masm 中打印数字的 OFFSET 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61078637/

相关文章:

assembly - 如何在汇编语言编程中提示用户输入字符串并再次显示

assembly - x86 函数必须保留哪些寄存器?

assembly - 故意在 RISC-V 中提出非法指令

linux - 将在 linux 中运行汇编代码的结果重定向到文本文件

c - GCC#define 语句字节顺序错误

assembly - 在堆栈帧创建之前或之后插入寄存器之间有什么区别吗?

assembly - 如何使用 SIMD 比较两个向量并获得单个 bool 结果?

c - 为什么在 MASM Assembly 中使用 FPU x87 指令集执行操作时会得到无意义的数字?

visual-studio - VS 2013中的FLAGS注册组件意味着什么?

assembly - 如何在 EDX 中打印乘法结果 :EAX in Assembly