1

リアルモードで実行され、画面にメッセージを出力するコードがあります。実行環境として Dosbox 0.7 を使用しています。以下はコードです。

 jmp 0x7c0:start

 start:
 mov ax, cs ; set up segments
 mov ds, ax
 mov es, ax
 mov al,03h
 mov ah,0
 int 10h
 welcome db "This is insane now"
 mov si, welcome
 call print_string
 print_string:
 lodsb        ; grab a byte from SI

 or al, al  ; logical or AL by itself
 jz .done   ; if the result is zero, get out
 mov ah, 0x0E
 int 0x10      ; otherwise, print out the character!
 jmp print_string
.done:
 ret

私はこのコードをうまく組み立てることができますが、これを実行すると、そこにハングアップし、Linuxターミナルにメッセージが表示されます

    Illegal read from b0671921, CS:IP      7c0:    4468

こんな感じで組み立てています

      nasm PRINT.ASM -o out.com 

このメッセージを Google で検索してみたところ、DOSBox のバージョンに問題がある可能性があることがわかりました。

ここで何が問題なのか誰か教えてもらえますか??

4

2 に答える 2

1

段階的に見てみましょう:

    jmp 0x7c0:start    ;jump to start

start:

     mov ax, cs        ; set up segments             
     mov ds, ax
     mov es, ax


     mov al,03h        ; Set up screen to 80 by 25
     mov ah,0
     int 10h

文字列は実行コードではないため、startラベルの前、jmp の後に置きます。文字列はゼロ文字で終了する必要があります!

 welcome db "This is insane now"#0

 mov si, welcome     ;Print string
 call print_string

プログラムを適切に終了するためのファイナライズ コードが欠落しているためprint_string、再度実行されます

print_string:
     cld          ;Clear direction flag instruction is missing
     lodsb        

     or al, al    ; test if zero char
     jz .done     ; exit if zero char
     mov ah, 0x0E ; Write Char in Teletype Mode 
     mov bh, 0    ; Define 0 page if we have multiple pages
     int 0x10     ; print character!
     jmp print_string
    .done:
     ret
于 2013-07-15T09:17:20.087 に答える