2016-11-22 3 views
-3

私はこのコード部分を私に "翻訳"できました。これは私が学校で持っていたコードから分けました。私は病気で、私が持っていたレッスンを見ていませんでした。この上の(私はレッスンを失ったため)と私は理解して傾ける空白it.Iは、インターネットをしようと試みたが、私はあなたがこのことから何かを理解することができfailed.Ifと私は何があるアセンブリメイン、メイン、S_LOOP

main proc 

1)非常に喜んでいただけることでしょう答える与えますアセンブリのmain proc?それは何をするためのものか?私はこれをどのように終わらせるべきですか?

MAIN endp 

2)前と同じです。なぜ大文字にされるのですか?

findchar PROC 

3)findcharは、charが、PROCを見つけることを試みるを指し?

S_LOOP 
LOOP S_LOOP 

4)これは何ですか?

findchar endp 

5)charが見つかるとMAINは終了しますか?

soros segment stack 

6)これはスタックにどのような影響を及ぼしますか?私のコードまでは私が持っている:

ASSUME CS:KODIKAS, DS:DEDOMENA, ss:soros 

*

Buffer 40DB dub(0) 

7)その "メッセージ" のため?

db 256 dup(0) 

8)同じく小文字と256文字で同じですか? 256は何ですか? :/

そのギリシャ語で

TITLE SIMPLE_ADD 
KODIKAS SEGMENT 
    ASSUME CS:KODIKAS, DS:DEDOMENA,ss:soros 
    ARXI: 
    main proc 
     MOV AX,DEDOMENA 
    MOV DS,AX 

    MOV SI,0 

     LEA DX,MINIMA 
     MOV AH,9 
     INT 21H 




    XANA: 
     MOV AH,1 
     INT 21H  

     CMP AL,35 ;GIA ENTER 
     JE CHECK 



    SAVE: 
    MOV BUFFER[SI],AL 
    INC SI 

    CMP SI,80 
    JB XANA 


    CHECK: 
     call findchar 

     MOV AH,4CH 


     INT 21H 
     MAIN endp 

    findchar PROC ;uporoutina 
     MOV CX,SI 
     JCXZ EXIT 
     MOV SI,0 
     LEA DX,MINIMA2 
     MOV AH,9 
     INT21H 

     MOV ah,1 
     INT 21h 
     MOV BL,0 
     MOV DL,AL 





findchar proc 
    MOV CX,SI 
    JCXZ EXIT 
    MOV SI,0 
    mov bl,0 

    LEA DX,MINIMA2 
    MOV AH,9 
    INT 21H 
    mov ah,1 
    int21h 

    S_LOOP 
     cmp al, BUFFER[SI] 
     jne next 
     inc bl 



      next: 



    inc si 


     LOOP S_LOOP 

    MOV bl,0 
    je nochar 

    lea dx,yparxei 
    mov ah,9 
    int 21h 

    cmp bl,9 
    ja dipsifios 
    mov dl,bl 
    add dl,48 
    mov ah,2 
    int 21h 

    ret 


    dipsifios: 


     MOV al,bl 
     mov ah,0 
     mov cl,10 
     div cl 

     mov ch,ah 

     mov dl,al 
     add dl,48 
     mov ah,2 
     int 21h 




     ret 



     nochar:  ;den uparxei 


     LEA DX,MINIMA3 
     MOV AH,9 
     INT21H 



findchar endp   









KODIKAS ENDS 

DEDOMENA SEGMENT 
    BUFFER 40DB dub(0) 



    MINIMA1 DB 10,13, "Eisagete keimeno : $" 
    MINIMA2 DB 10,13,"Eisagete char gia anazitisi :$" 
    MINIMA3 DB 10,13,"Den yparxei kanenas xaraktiras :$" 
    YPARXEI DB 10,13,"O xarakthras yparxei fores : $" 
    BUFFER DB 80 DUP(0) 
DEDOMENA ENDS 
soros segment stack 
    db 256 dup(0) 


    END ARXI 
+1

スペルや文法に関する質問を編集してください。私は試しましたが、あなたが話していることを理解できません:/ – Blacksilver

+0

今すぐですか?それとも理解できないのですか? –

+1

私はアセンブルでどのようにプログラムするのか分かりません。私はちょうど人々を手伝っています:) – Blacksilver

答えて

0

1)、2)及び3)

これらはemu8086(およびMASM/TASM)アセンブラ指令はなく、x86のmachine codeの一部です。私はこれらを使用しないので、私はそれらを掘るのが気にせず、あなたは簡単にそれらのためのGoogleドキュメントをすることができます。

mainMAINは、コンパイル時に構文エラー(私がそれらを使用しない理由)につながるようにも見えます。

おそらく最も重要なポイントは、これらがCPUのマシンコードを生成しないことです。彼らはソースを整理し、アセンブラのシンボル(ラベル)を生成するのに役立ちます。そのため、シンボル名であるcall findcharのようにプロシージャのエントリーポイントで作業し、アセンブラにfindcharの最初の命令がどのくらい離れているか把握させますそれをcall命令オペコードにエンコードします。手動での違いをカウントしfindcharコードは84のバイト先にそのcall命令の開始するとき、例えば、call -87のために記述する必要がありますシンボルなし

(IIRC callオペコードが長い3バイトなので、84 + 3 = 87となります)。 LOOP S_LOOP

S_LOOPS_LOOP

は、ラベルの定義であるが、それは私を混乱させているエンド(S_LOOP:)、でコロン、emu8086で動作し、おそらく別の構文の癖を欠けています。したがって、アセンブラのシンボルテーブルにシンボルが再びあります。

LOOP S_LOOPは、実際のx86命令loopです。

x86命令の内容が不明な場合は、インテルのリファレンスガイドを参照してください。

5)及び6)

は再びアセンブラディレクティブであり、あなたは彼らが何を意味するかにも近くありません。

ところで推測アセンブラの意味は何ですか?それは役に立たない。リファレンスガイドの1つでその定義を見つけてください。

アセンブラは、高水準言語とは異なり、よく読みやすいと定義されています。これはHW設計のCPU命令のエイリアスです。通常、何が起こるかについては細かいことがたくさんあります(通常、ある種のことをコードで単純なやり方で可能にする非常に良い理由があります。それ)。したがって、指示DIV bxは、入力としてaxdxを受け取り、とdxも変更します。あなたは「DIV bx」からしか推測できません。

(私はいくつかの異なるアセンブラ構文の方言で、よく3つの異なるCPU用のアセンブリを知って、まだ私は、別のターゲットCPUのソースコードについて何かを推測しようとする時はいつでも、まだ、私はかなり頻繁に失敗し、ドキュメントをGoogleに持っている)

Buffer 40DB dub(0)
7)「メッセージ」のためですか?

文法的に間違っているので、これはコンパイルされないと確信しています。

元の行はおそらくBuffer DB 40 DUP (0)でした。これは2つのアセンブラディレクティブを使用しており、labelを定義していて、実際には1バイトの値が定義されています。

Buffer

は、実際には、特定の状況で役立つ、そうであっても先に DBBuffer:を使用しようと、再び損はない、それにコロンを追加し、ラベルの定義です。

DBはおそらくすべてのx86アセンブラで共有される非常に一般的なアセンブラディレクティブです。これは "define byte"を意味します。したがって、アセンブラは命令ニーモニックの代わりに数値のバイト値を配置し、アセンブラは指定した値をマシンコードに入れなければなりません。

<times> DUP (<value>)<value><times>何度も複製するようにコンパイラに伝える、特定のディレクティブMASM/TASM/emu8086あるので、あなたは手でDB 0, 0, 0, ..., 0 ; 40 zeroesを記述する必要はありません。

この行は、40バイトのゼロバイトとしてコンパイルされます(おそらく、一部の文字列のバッファとして動作しますが、実際にはコードをチェックしていませんでした。

デシベル256 DUP(0)
8)小文字と256で再び同じ? 256は何ですか?

ほとんどのアセンブラでは大文字と小文字が区別されません。したがって、どちらの場合でもディレクティブと命令を両方書くことができます。したがって、dbDBであり、dupDUPであり、どちらも上で説明しました(これはマシンコードでゼロの値を持つ256バイトを生成します)。

シンボル名の大文字と小文字の区別が少し驚くことですが、emu8086がMASM(Microsoft Assembler)を模倣しようとしているのであれば、やはり不思議ではありません。