4

私のアセンブリ言語クラスでは、最初の課題は、DOSでドルで終わる単純な文字列を出力するプログラムを作成することでした。次のようになりました。

BITS 32
    global _main

section .data
    msg db "Hello, world!", 13, 10, ’$’

section .text
_main:
mov ah, 9
mov edx, msg
int 21h
ret

私が理解しているように、$記号は、Cのnullのように刺し傷を終わらせるのに役立ちます。しかし、文字列にドル記号を入れたい場合(「30ドルかかる」と印刷したい場合など)はどうすればよいですか?これは簡単な質問のように思えますが、私の教授は答えを知りませんでした、そして私はグーグル検索を使ってそれを見つけられないようです。

4

7 に答える 7

9

0x09DOS のサービスを使用して標識を表示することはできません。$使用する必要があります0x02ここを参照してください。

于 2009-01-26T21:16:57.267 に答える
3

writeサービス ( AH=0x40)を使用することを好みます。

  • AH=0x40
  • BXファイルハンドルです。サービスと同じデバイス (画面など) に書き込むには、値 1 を使用します。AH=9
  • CX書き込むバイト数です。データは「終了」していない (NUL によっても によってもされていない$) ため、すべての値 (0 から 255 まで) を書き込むことができます。
  • DS:DX書き込まれるデータ(あなたの場合は文字列)を指します(
    サービスの場合と同じですAH=9; 32ビットDOS拡張機能を使用する場合:EDXもちろん)

このサービスは、実際にはデータをファイルに書き込むことを目的としています。ただし、1 に設定することで、「文字列」を「出力」に書き込むためにも使用できますBX

于 2020-10-01T16:30:04.667 に答える
3

または、独自の print_string を作成して、文書化されていない INT 29h (AL の印刷文字) を使用して NULL で終わる文字列を印刷します。

; ds:si = address of string to print
print_string:
    lodsb                   ; load next character from ds:si
    or al, al               ; test for NULL-character
    jz .end_of_string       ; end of string encountered, return.
    int 29h                 ; print character in AL on screen
    jmp print_string        ; print next character
.end_of_string:
    ret                     ; return to callers cs:ip

(NASM を使用していると仮定します)

于 2009-01-26T21:35:33.453 に答える
0

1 つの方法は、1 文字を出力する呼び出しを見つけることです。これで任意の文字を印刷できます。文字列を分割して、「コスト」、「$」、最後に「30」を出力します。より多くの作業が行われますが、仕事は完了します。

于 2009-01-27T07:35:41.917 に答える
-1

09 サービスの代わりに INT 21H の02 サービスを使用できます。

これがサンプルです。

mov dl, '$'

mov ah,02

int 21h
于 2015-05-25T04:16:25.700 に答える
-2

うーん。$エスケープを考慮したアセンブリを書くことができます\$。しかし、その後、あなた\も特別なシンボルになり、\\印刷するために使用する必要があります\

于 2009-01-26T21:14:12.483 に答える
-5

'$$'、'\044' (8 進数)、または '\x24' (16 進数) を試してください。

于 2009-01-26T21:18:47.763 に答える