【问题标题】:tasm: operand type does not matchtasm:操作数类型不匹配
【发布时间】:2015-08-23 17:48:54
【问题描述】:
.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

【问题讨论】:

  • 我在这里没有看到问题...
  • 另外,在发布错误消息时,您应该指出错误消息对应的行。

标签: assembly tasm


【解决方案1】:

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

  • 一个字大小的变量到一个字节大小的寄存器中 (mov al, readchar)
  • 将字节大小的寄存器转换为字大小的寄存器 (mov si, al)

要解决这些问题,您必须考虑下一个数据定义真正代表什么。

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

这 4 行代码一起是 DOS 输入函数 0Ah 使用的结构。它需要 bytes 在第一个和第二个字段中!
所以为了摆脱第一个问题,把它改成

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], '$'

【讨论】:

    【解决方案2】:

    第一个错误:

    readchar dw 0
    ...
    mov al, readchar
    

    readchar 被定义为 WORD ("dw" = "data word",有人说 "define word"。一个字的大小为 16 位。AL 是一个 8 位寄存器。不能将 16 位字存储到 8 位寄存器中。

    第二个错误:

    mov si, al
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 2023-03-27
      • 2018-08-05
      • 2018-11-02
      • 2015-07-23
      相关资源
      最近更新 更多