0

TASMを使用しています。

このIO.hファイルをコンソールとの間の入出力に使用します。そしてまたのためitoaatoi

私のプログラムは:(目的は単に20h2つのメモリ位置にコピーして両方を出力することです。)

include io.h

data segment
    msg2 db 13, 10, "here it is", 13, 10, 0
    tmp dw ?, 0
    num dw ?, 0
    tmp2 dw ?, 0
data ends
code segment
    assume cs:code, ds:data
    start:
        ;load segments
    mov ax, data
    mov ds, ax

    ;store 20h
    mov ax, 20h
    ;copy to both num and tmp2
    mov num, ax
    mov tmp2, ax

    ;output
    output msg2
            ; (itoa puts the output-able into destination, "tmp" here)
    itoa tmp, tmp2
    output tmp

    ;output
    output msg2
    itoa tmp, num
    output tmp
    ;return control
    mov ax, 4c00h
    int 21h
code ends
    end start

私が得る出力は次のとおりです:

here it is
32
here it is
12851

ただし、変数定義の順序を少し変更すると(tmp2とnumを入れ替えます):

data segment
    msg2 db 13, 10, "here it is", 13, 10, 0
    tmp dw ?, 0
    tmp2 dw ?, 0
    num dw ?, 0
data ends

出力は次のとおりです。

here it is
32
here it is
32

誰かがこれが起こる理由を説明できますか?2番目の出力は、どちらの場合も期待したものです。

ps:また、なぜstartラベルを使用する必要があるのですか?それがコードセグメントの外に出ているのは非常に奇妙だと思います。そのラベルがないと正しく機能しません。

4

1 に答える 1

2

リンクしたには、ライブラリ内のio.hを呼び出すマクロのみが含まれているため、itoa_procその手順がどのように機能するかわかりません。おそらく余分なスペースを使用するため、結果(32)が2バイトに収まっても、次のメモリ位置を上書きして値を破壊する可能性があります。12851メモリ内ではが のように0x3233見えることに注意してください。これは の ASCII 表現にすぎません。ここで推測するだけですが、最初に右揃えの出力を生成し、次に左に移動している可能性があります。0x330x3232itoa

ドキュメントまたはソース コードがある場合はそれを読むか、出力文字列用にスペースを確保してください。16ビットの数値の場合、7バイトで十分であると想定しています。可能な符号の場合は1、数字の場合は5、終端のゼロの場合は1です。

于 2013-01-26T13:25:35.917 に答える