1

Nasmプリプロセッサを使用して整数を文字列に変換するにはどうすればよいですか?たとえば、次のコードについて考えてみます。

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

シンボルmyStringはに評価されSixty-five is Aます。望ましい結果はSixty-five is 65です。どうすればこれを達成できますか?そのような些細な質問のように思えますが、Nasmのドキュメントは何も生み出していません。ありがとう!

4

3 に答える 3

3

このコード

%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を使用しました。

于 2013-03-27T01:50:38.520 に答える
1

%defstrマクロを使用する必要があります。

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

https://www.nasm.us/xdoc/2.15.05/html/nasmdoc4.html#section-4.1.9

于 2021-12-24T11:03:29.493 に答える
0

現時点では、NASMでこれをテストすることはできませんが、少なくともYASMでは機能します(テストを容易にするためにLinux x86-64印刷コードを追加しました)。

[ビット64]

%define myInt 65
%define myTens myInt / 10 + 48
%define myOnes myInt-(myInt / 10)* 10 + 48
%define myString'65は'、myTens、myOnes

セクション.text
グローバル_start

_始める:
    mov edi、1; STDOUT        
    mov rsi、my_string
    mov edx、my_string_length; 文字列の長さ(バイト単位)。
    mov eax、1; 書きます
    システムコール

    xor edi、edi
    mov eax、60; 出口
    システムコール

セクション.data
my_string db myString
db 0x0a
my_string_length equ $ -my_string
于 2013-03-27T01:45:12.870 に答える