.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
答案 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位寄存器中。