アセンブラに関する質問

このQ&Aのポイント
  • アセンブラに関する質問について解説します。
  • MASMでコンパイル&リンクして実行すると、入力まではできるがエラーが発生します。
  • エラーメッセージやソースコードの問題点などを詳しく教えてください。
回答を見る
  • ベストアンサー

アセンブラに関する質問

↓のソースをMASMでコンパイル&リンクして実行すると  入力まではできるのですが、入力した直後に   「このプログラムで無効な処理が発生したため、強制    終了されます。全てのプログラムを、終了してから    再起動してください」 と表示され、そのメッセージが表示されたウィンドウの下の方の「詳細」をクリックすると    「プログラムで一般保護エラーが発生しました     エラーが起きたアドレス 9A00:10000     サービスへの割り込み なし」     と表示されました     実行したのは↓にソースですが、何がいけなくて     このエラーが出たのでしょうか・・(OSはME) CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov ah,0Ah mov dx,offset BUFF int 21h mov ah,09h mov dx,offset BUFF2 int 21h BUFF db 54,87,5 dup(?) BUFF2 db 'testtest' '$' code ends end start

  • tukai
  • お礼率57% (102/177)

質問者が選んだベストアンサー

  • ベストアンサー
  • gookuma
  • ベストアンサー率33% (16/48)
回答No.2

ここ10年ぐらいアセンブラは触ってないので忘れかけてますが。。。試してみてください。 1. START: の直後に以下のコードを入れてみてください。 push cs pop ds 2. BUFF の直前に以下のコードを入れてみてください。 mov ah,4ch mov al,00h int 21h 3. 開始オフセットが 100hなので COMモデルだと思いますが、LINKした後に、EXE2BINで COM形式に変換してますか?

tukai
質問者

お礼

有難う御座いましたこれで、実行中強制終了する事がなくなりました

その他の回答 (1)

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

MS-DOSの COMモデル のプログラムですか? プログラム終了のシステムコール(確か、AH=0)は呼んでいますか?

関連するQ&A

  • アセンブラできません。

    初心者です。 アセンブリ言語で1~9の数字を連続的に表示するプログラムを書いたのですが、アセンブラする時 「error A2016 expression expected」というエラーメッセージが出てアセンブラすることができません。 プログラムの内容は下記↓のものです。 何が原因でしょうか? CODE SEGMENT ASSUME DS:CODE,CS:CODE,ES:CODE,SS:CODE ORG 100h START: mov bl,30h jmp aa aa: mov ah,02h mov dl,bl int 21h mov ah,06h mov dl,0ffh int 21h jnz bb: mov ah,02h mov dl,08h int 21h inc bl cmp bl,39h ja START jmp aa bb: int 20h CODE ENDS END START

  • アセンブラ、ファンクションコールの使い方

    入力した一文字を改行して表示させるものを作ってます。 以下のものを書いてみまして、 一文字読み取って改行はしますが表示されません。 アドバイス頂けますでしょうか? 環境は MASM 32 です。 name double .model small .stack 100 .data prompt db 0ah,0dh,"? $" .code start: mov ax, @data mov ds, ax lea dx, prompt mov ah, 9 ;output string int 21h mov ah, 1 ;get keyboard input and store into al int 21h mov dl, 0ah mov ah, 2 int 21h mov dl, 0dh mov ah, 2 int 21h mov dl, al mov ah, 2 ;output char from dl int 21h mov ax, 4c00h ;exit int 21h end start

  • アセンブラについての質問です

    学校からの課題でキーボードから1文字入力し、アルファベットの大文字なら小文字に、小文字なら大文字に変換して表示するプログラムでリターンキーが押されるまで繰り返すというもので mov ah 1 int 21h sub al '0' xor al 0dh mov dl al add dl '0' mov ah 2 int 21h までやってたんですが繰り返しの所がよく分かりません 調べたんですが難しくて分かりませんでした どなたか、教えて頂けないでしょうか?出来れば、方法だけでなくソースも書いて頂けると有り難いのですが・・・ よろしくお願いします。

  • NASM(独習アセンブラのサンプルソース)について

    独習アセンブラ初版5刷のサンプルソース(リスト6.7、102p)での疑問です 下の方にあるコメントアウトしているputc関数って何のためにあるんですか? どこからも呼び出してないのでいらないと思うのですが… アセンブラはNASMです ※本に書かれてるソースはコメントアウトしてません、コメントアウトしてもアセンブルできました bits 16 org 100h mov dx,sfile mov al,0 mov ah,3dh int 21h jc endquit mov [ifh],ax mov dx,dfile mov cx,0 mov ah,3ch int 21h jc endquit mov [ofh],ax readb: mov bx,[ifh] mov dx,buf mov cx,1 mov ah,3fh int 21h test cx,ax jz endquit jc endquit mov bx,[ofh] mov dx,buf mov cx,1 mov ah,40h int 21h jmp readb endquit: mov bx,[ifh] mov ah,3eh int 21h mov bx,[ofh] mov ah,3eh int 21h mov ax,4c00h int 21h ;putc: ; push ax ; mov ah,2h ; int 21h ; pop ax ; ret ifh dw 0 ofh dw 0 sfile db "srcfile.txt",0 dfile db "destfile.txt",0 buf resb 2 私が思うにリスト6.6(100p)のreadbラベルのところでこれを呼び出してるのでソースを流用して消し忘れてるだけなんでしょうか?

  • アセンブラ(二度目)

    先ほど質問させていただいたのですが、NASMでobjファイルを出力して、 ALINKをつかってexeファイルを出力したのですが、その際結果を確認するのに邪魔なものが一緒に出力されました。 ソースはこれです。 segment code ..start: mov ax, data mov ds, ax mov ax, stack mov ss, ax mov sp, stacktop mov dx, hello mov ah, 0x09 int 0x21 mov ax, 0x4c00 int 0x21 segment data hello: db 'Hello World',13,10,'$' segment stack stack resb 64 stacktop:

  • アセンブラ、ビデオモード al 13h でマウスのポインタを表示

    mov ah, 0 mov al, 13h int 10h のモードでマウスのポインタを表示することは可能でしょうか? 以下のコードを書いてみまして、ビデオモードを設定しない場合は Alt + Enter でフルスクリーンにすればポインタが表示されます。 環境は masm32、interrupt のリストはこちらです ↓ http://www.ctyme.com/intr/int.htm ---------------------------------- .model small .stack 100h .data .code start: mov ax, @data mov ds, ax mov ah, 0 ; set video mode mov al, 13h int 10h ; mov ax, 0 ; reset ; int 33h ; mov ax, 20h ; int 33h mov ax, 1 ; show mouse pointer int 33h mov ah, 1 ; wait for key int 21h mov ah, 0 ; restore video mode mov al, 3h int 10h mov ax, 4c00h ; exit int 21h end start

  • アセンブラを実行したいのですが

    パソコン初心者です。 Windows XPにアセンブラ「NASM」をダウンロードしました。 コマンドプロンプトで簡単なプログラムを実行しようと思います。 以下がプログラムです。 ; dispchar.asm mov ah,02 mov dl,31h int 21h mov ah,4ch mov al,0 int 21h コマンドプロンプトに「; dispchar.asm」と入力すると、内部コマンド、外部コマンドまたは操作可能なファイル、バッチファイルとして認識されていません」と出ます。 同様に、「mov ah,02」から入力しても同様のコメントが返ってきます。 プログラムを実行するにはどうすればよいでしょうか?

  • アセンブラでの記述について教えてください。

    アセンブラでの記述について教えてください。 CMDでのアセンブリで、 mov dx , [0200] (0200へは'ab'を代入しておく) mov [0400] , dx とすれば0400番地へabが複写されるのですが、これをmasmで mov dx , data1 mov data2 , dx data1 db 'ab' data2 db '00' とすれば「invalid instruction operands」というエラーが生じます。 dataのアドレス値を他に格納してから複写すると上手くいくのですが、お聞きしたいのは上記の違いです。 [0200]はmasmだと data1 また、 [0400]はmasmだと data2  実際のアドレス値は当然違いますが、これは理屈的に同じとならないのでしょうか? なぜmasmの場合だと、 mov si , offset data1 mov di , offset data2 mov al , [si] mov [di] , al などのように、わざわざアドレス値を用いて遠まわしにしなければならないのでしょうか? どなたかご教授のほどをお願いします。

  • アセンブリ:FCのファイルオープンについて

    アセンブリ:FCのファイルオープンについて ファイルオープンのファンクションコールについて質問させてください。 うまく伝えられるか不安なので、いま陥っている現象を順番に書かせていただきます。 まずエディタで、 ---------------------------------- MOV AH , 3DH MOV AL , 00H MOV DX , offset FNAME INT 21H FNAME DB 'C:\xyz.txt',00H ---------------------------------- という簡易なプログラムを記述しました(擬似命令は省いています) これをアセンブルすると、 --------------------------------------- CS:0100 B43D MOV AH,3D CS:0102 B000 MOV AL,00 CS:0104 BA0901 MOV DX,0109 (*注) CS:0107 CD21 INT 21 CS:0109 43 INC BX ・ ・ --------------------------------  となるのですが、このとき AX=0003  CY となり、ファイルオープンに失敗してしまいます。 理由がまったくわからないので、デバックの直打ちで 0200 DB 'C:\xyz.txt' と格納してから、(*注)である命令を MOV DX,0200 に打ちかえれば、 AX=0005  NC となって無事にオープンできるみたいです。 なお、ファイルオープンに限らず、ファイル作成でも同じでした。 エディタでアセンブル( DX , 0109 ) だと失敗し、 デバッグ直打ち( DX , 0200 ) だと成功します。 これはいったい、どういう理由からなのでしょうか? 何冊か本を読んでみたのですが、書かれているのはコードの記述のみなので困っています。 わかる方がおられましたら、ご教授ください。 WINXP:MASM32で行っています。

  • アセンブリ言語で変数を正しく使えない

    アセンブリ言語の勉強をして、小文字のaからzまでを表示するプログラムを書いています。今回、以下のようなコードを書きました。 org 100h mov dl, 61h           ;'a'のコード Disp: mov ah, 02h          ;1文字表示 int 21h inc dl                ;dlレジスタ内の文字コードをインクリメント cmp dl, 7Ah+1           ;dlレジスタ内のコードと'z'の文字コードを比較 jnz Disp              ;一致しなければループ mov ah, 4Ch int 21h sCode db 61h eCode db 7Ah ここで連続表示する文字の始点と終点をあとで変更することになった場合を考え、最後の2行にsCode(始点となる文字コード)とeCode(終点となる文字コード)という2つの変数を設定しました。しかしこれらをそれぞれコード中の即値61hと7Ahと置き換えるとうまく動作しません。何も文字が表示されずに終わってしまいます。これは何故なのでしょうか?