1

我有这个计算一些素数的汇编代码:

#include <stdio.h>

int main() {
    char format[] = "%d\t";

    _asm{
        mov ebx, 1000
        mov ecx, 1
        jmp start_while1
incrementare1:
        add ecx, 1
start_while1:
        cmp ecx, ebx
        jge end_while1
        mov edi, 2
        mov esi, 0
        jmp start_while2
incrementare2:
        add edi, 1
start_while2:
        cmp edi, ecx
        jge end_while2
        mov eax, ecx
        xor edx, edx
        div edi
        test edx, edx
        jnz incrementare2
        mov esi, 1
end_while2:
        test esi, esi
        jnz incrementare1
        push ecx
        lea ecx, format
        push ecx
        call printf
        pop ecx
        pop ecx
        jmp incrementare1
end_while1:
        nop
    }
    return 0;
}

它工作正常,但我还想在 asm 中声明“格式”字符串,而不是在 C 代码中。我试过添加类似的东西,format db "%d\t", 0但没有用。

4

2 回答 2

2

如果一切都失败了,总会有丑陋的方式:

format_minus_1:
mov ecx,0x00096425  ; '%', 'd', '\t', '\0' in little-endian format
lea ecx,format_minus_1 + 1  ; skip past the "mov ecx" opcode
push ecx
call printf
于 2013-01-23T20:17:52.880 回答
1

您不能_asm使用这些指令在块内定义对象。C 声明为您在堆栈上分配空间,因此如果您想在_asm块内执行类似的操作,您需要操作堆栈指针并自己初始化内存:

sub esp, 4
mov [esp], '%'
mov [esp + 1], 'd'
mov [esp + 2], '\t'
mov [esp + 3], '\0'
...
push ecx
push esp + 4
call printf

请注意,这是一种方式。不一定是最好的方法。让 C 为您进行内存管理的最佳方式。

于 2013-01-23T20:26:20.207 回答