1

私にはやらなければならない仕事があり、助けを求めています。(単純なc lang'で)

私は何をする必要がありますか?メインの c プログラムのすべてのコマンドを (割り込み num 1 を使用して) チェックし、次のコマンドが他の手順によって以前にスタックに送信されたのと同じ手順である場合にのみメッセージを出力する必要があります。

私がしたいこと?インラインアセンブリーを使用してスタックから情報を取得し、c に戻った後に c プログラム自体で比較できる変数に配置したいと考えています。(揮発性)

これはプログラムです:

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>

typedef void (*FUN_PTR)(void);
void interrupt (*Int1Save) (void); //pointer to interrupt num 1//

volatile FUN_PTR our_func;
char *str2;

void interrupt my_inter (void) //New interrupt//
{volatile FUN_PTR next_command;
asm {   PUSH BP
    MOV BP,SP
    PUSH AX
    PUSH BX
    PUSH ES
    MOV ES,[BP+4]           
    MOV BX,[BP+2] 
    MOV AX,ES:[BX]
    MOV word ptr next_command,AX  
    POP ES
    POP BX
    POP AX
    pop BP}
if (our_func==next_command) printf("procedure %s has been called\n",str2);}

void animate(int *iptr,char str[],void (*funptr)(), char fstr[])
{
str2=fstr;
our_func=funptr;

Int1Save = getvect(1); // save old interrupt//
setvect(1,my_inter); 
    asm {   pushf //TF is ON//
    pop ax
    or ax,100000000B
    push ax
    popf}}

void unanimate()
{asm {  pushf //TF is OFF//
        pop ax
        and ax,1111111011111111B
        push ax
        popf}
setvect (1,Int1Save); //restore old interrupt//}

void main(void)
{int i;
 int f1 = 1;
 int f2 = 1;
 int fibo = 1;

 animate(&fibo, "fibo", sleep, "sleep");
 for(i=0; i < 8; i++)
 {
  sleep(2);
  f1 = f2;
  f2 = fibo;
  fibo = f1 + f2;} // for//
 unanimate();} // main//

私の質問...もちろん、問題はインラインアセンブリの「私のインター」にあります。しかし、それを理解することはできません。私は何を間違っていますか?(上記のコードを見てください) 特定のプロシージャ (sleep) のポインタのアドレスを volatile our_func に保存したかったのです。次に、情報 (次の各コマンドへのアドレス) をスタックから volatile next_command に取得し、最後に c に戻り、毎回比較を行います。同じ値 (アドレス) が両方の変数にある場合、特定のメッセージを出力します。私がはっきりしていることを願っています..

10倍、

ニルB

4

1 に答える 1

0

OPによるコメントとして回答

私が望んでいた答えを得ました:

asm {   MOV SI,[BP+18]  //Taking the address of each command//
        MOV DI,[BP+20]
        MOV word ptr next_command+2,DI
        MOV word ptr next_command,SI}
if ((*our_func)==(*next_command))   //Making the next_command compare//
    printf("procedure %s has been called\n",str2);
于 2014-06-18T07:30:09.003 に答える