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. cmp不使用 2 个内存操作数,很少有指令使用,当它们使用时,最多有一个内存操作数被显式指定,另一个预计将以预定义的方式隐式寻址,而无需您将其告知汇编程序。
  2. 内存操作数的大小不明确,汇编器无法确定它应该是 a byte、 aword还是 a dword(双字)。

您应该将其中一个内存操作数加载到寄存器中,然后cmp使用该寄存器和另一个内存操作数。

顺便说一句,类似的行mov [si],"$"也可能存在上述问题 2,因为数字(“$”解析为“$”的 ASCII 代码)没有与之关联的大小,并且内存操作数是裸露的,缺少尺寸规格。正确/明确的方法是拼出内存操作数大小,如下所示:

mov byte ptr [si],"$"

宏不是子例程,您不要调用它们:

call Msg_display e1

这是对宏的无效使用。它应该是类似Msg_display e1Msg_display(e1)Msg_display<e>代替的东西。

这里没有这种形式的div指令:

div ax,3

div接受一个显式操作数(除数),它不是立即数 (3)。它可以是寄存器或内存操作数。另一个操作数(被除数)是 in ax(当做 16/8=8,8 除法dx:ax时)或 in(当做 32/16=16,16 除法时)。dx此外,如果您的股息是 16 位,请记住将其归零。

于 2012-09-26T20:41:13.200 回答