tasm:操作数类型不匹配

时间:2015-08-23 17:48:54

标签: assembly tasm

.model small
.stack
.data
    buff label byte
    maxchar dw 50
    readchar dw 0
    name1 db 48 dup(0)
    m1 db 10,13,"enter name: $"
    m2 db 10,13,"your name is: $"
.code
    mov ax, @data
    mov ds, ax
    lea dx, m1
    mov ah, 09
    int 21h
    lea dx, buff
    mov ah, 10
    int 21h


    mov ah,0
    mov al, readchar
    add ax, 2
    mov si, al
    mov buff[si],24H ;ascii code for $ to terminate string
    lea dx, m2
    mov ah, 9
    int 21h
    lea dx, name1
    mov ah, 09
    int 21h

    mov ah, 4ch
    int 21h
end

2 个答案:

答案 0 :(得分:3)

操作数类型不匹配错误来自于尝试移动

  • 字大小的变量到字节大小的寄存器(mov al, readchar
  • 字节大小的寄存器到字大小的寄存器(mov si, al

要解决这些问题,您必须考虑下一个数据定义的真正含义。

buff label byte
 maxchar dw 50
 readchar dw 0
 name1 db 48 dup(0)

这4行代码一起是DOS输入函数0Ah使用的结构。它希望第1和第2个字段中的字节! 所以要摆脱第一个问题,将其改为

buff label byte
 maxchar  db 50
 readchar db 0
 name1    db 48 dup(0)

要纠正第二个问题,只需写下你想要的mov si, ax

作为奖励,为什么不把标签 name1 用于工作?它将为您保存add ax, 2指令。

mov ah, 0
mov al, readchar
mov si, ax
mov name1[si], '$'

作为第二个奖励,您可以使用BX寄存器代替SI并保存另一条指令。

mov bh, 0
mov bl, readchar
mov name1[bx], '$'

答案 1 :(得分:1)

第一个错误:

readchar dw 0
...
mov al, readchar

readchar被定义为WORD(" dw" =" d ata w ord"有人说" d efine w ord"。一个字的大小为16位。AL是一个8位寄存器。你不能将一个16位字存储到一个8位寄存器中。

第二个错误:

mov si, al

SI是一个16位寄存器,AL是一个8位寄存器。您不能将8位寄存器复制到16位寄存器中。