Nasm:使用预处理器将整数转换为字符串

时间:2013-03-27 01:07:40

标签: assembly preprocessor nasm

如何使用Nasm预处理器将整数转换为字符串?例如,请考虑以下代码:

%define myInt 65
%define myString 'Sixty-five is ', myInt

符号myString将评估为Sixty-five is A。期望的结果是Sixty-five is 65。我怎样才能做到这一点?这似乎是一个微不足道的问题,但纳斯姆的文件却没有产生任何结果。谢谢!

2 个答案:

答案 0 :(得分:2)

此代码

%define myInt 65
%define quot "
%define stringify(x) quot %+ x %+ quot
%strcat myString 'Sixty-five is ', stringify(myInt)

bits 32
db myString

生成以下列表文件:

 1                                  %define myInt 65
 2                                  %define quot "
 3                                  %define stringify(x) quot %+ x %+ quot
 4                                  %strcat myString 'Sixty-five is ', stringify(myInt)
 5                                  
 6                                  bits 32
 7 00000000 53697874792D666976-     db myString
 8 00000009 65206973203635     

和以下二进制文件:

0000000000: 53 69 78 74 79 2D 66 69 │ 76 65 20 69 73 20 36 35  Sixty-five is 65

我使用了2012年3月12日编译的NASM版本2.10。

答案 1 :(得分:0)

目前无法使用NASM对此进行测试,但这至少在YASM中起作用(我添加了一个Linux x86-64打印代码,以便于测试):

[bits 64]

%define myInt 65
%define myTens myInt/10 + 48
%define myOnes myInt-(myInt/10)*10 + 48
%define myString 'Sixty-five is ', myTens, myOnes

section .text
global _start

_start:
    mov edi,1   ; STDOUT        
    mov rsi,my_string
    mov edx,my_string_length    ; length of string in bytes.
    mov eax,1   ; write
    syscall

    xor edi,edi
    mov eax,60  ; exit
    syscall

section .data
my_string db myString
db 0x0a
my_string_length equ $-my_string