0

これがアセンブリプログラムです。

「3人の従業員の名前と給与を入力し、それらの給与を合計して合計給与を表示し、平均給与を表示します」

ここにコードがあります

Msg_display Macro str
    mov ah,09h
    mov dx,offset str
    int 21h
EndM Msg_display

.model small
.stack 100h
.data
        e1 db "Enter Name And Salary of 1st Employee","$"
        e2 db "Enter Name And Salary of 2nd Employee","$"
        e3 db "Enter Name And Salary of 3rd Employee","$"
    N1 db 20 dup(?)
    N2 db 20 dup(?)
    N3 db 20 dup(?)
    s1 db 0
    s2 db 0
    s3 db 0
        num db 0
        msg1 db "After Adding their Salaries, Result is....","$"
        msg2 db "Average Salary Is....","$"
        Ent db 0ah,0dh,"$"

.code
    mov ax,@data
    mov ds,ax

        Msg_display e1
    mov si,offset N1
    call input_str
    call No_input
    mov s1,ax

        Msg_display e2
    mov si,offset N2
    call input_str
    call No_input
    mov s2,ax

        Msg_display e3
    mov si,offset N3
    call input_str
    call No_input
    mov s3,ax

Input_str Proc
    mov ah,01h
    int 21h
    mov [si],al
    inc si
        cmp al,0dh
    JE end_input
    Jmp Input_str
End_input:
    mov [si],"$"
Input_str EndP

No_input Proc
    mov ah,01h
    int 21h
    cmp al,0dh
    JE skip

    sub al,48
    xor ah,ah
    mov num ,ax
    pop ax
    mul bx
    add ax,num
    push ax

skip:
    pop ax
    ret
No_Input endp

mov ax,s1
add s2,ax
add s2,s3

mov ah,09h
mov dx, offset msg1
int 21h

mov ah, 02h
mov al, s2
int 21h

mov ax,s2
mov bx,3

div bx
mov ah,09h
mov dx, offset msg2
int 21h

mov ah, 02h
mov dl,al
int 21h

mov ah,04ch
int 21h


End

「行番号 32,38,44,66,69,77,78,79,86 の命令演算子が無効です」というエラーが表示され続けます

4

1 に答える 1

1

これ

cmp [si],[di]

無効な命令です。いくつかの理由で無効です。

  1. cmp2つのメモリオペランドを使用せず、使用する命令はほとんどありません。使用する場合、メモリオペランドの最大1つが明示的に指定され、もう1つは、アセンブラに通知せずに、事前定義された方法で暗黙的にアドレス指定されることが期待されます。
  2. メモリオペランドのサイズがあいまいであるため、アセンブラはそれが、、、または(ダブルワード)byteであるかどうかを判断できません。worddword

メモリオペランドの1つをレジスタにロードしてからcmp、そのレジスタと他のメモリオペランドを使用する必要があります。

ところで、のような行にmov [si],"$"も上記の問題2がある可能性があります。これは、数値( "$"が解決される"$"のASCIIコード)にはサイズが関連付けられておらず、メモリオペランドがむき出しであり、サイズ指定。正しい/明確な方法は、次のようにメモリオペランドのサイズを詳しく説明することです。

mov byte ptr [si],"$"

マクロはサブルーチンではありません、あなたはそれらを呼び出さないでください:

call Msg_display e1

これはマクロの無効な使用です。Msg_display e1またはのようなものにする必要がありMsg_display(e1)ますMsg_display<e>

ここにそのような形式のdiv命令はありません:

div ax,3

div1つの明示的なオペランド(除数)を取りますが、これは即時定数ではありません(3)。レジスタまたはメモリオペランドにすることができます。もう一方のオペランド(被除数)は、in ( 16/8 ax= 8,8除算を行う場合)またはin (32/16 = 16,16除算を行う場合)のいずれかです。また、配当が16ビットの場合はdx:axゼロにすることを忘れないでください。dx

于 2012-09-26T20:41:13.200 に答える