2013-03-27 43 views
0

如何使用Nasm預處理器將整數轉換爲字符串?例如,請考慮下面的代碼:Nasm:使用預處理器將整數轉換爲字符串

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

符號myString將評估爲Sixty-five is A。期望的結果是Sixty-five is 65。我怎樣才能做到這一點?這似乎是一個微不足道的問題,但納斯姆文件卻一無所獲。謝謝!

回答

1

此代碼

%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 

我用在3月12日2012年

+0

好主意,謝謝編譯NASM 2.10版! – Orby 2013-03-27 02:21:31

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