我正在编写一个猜数字游戏,但我在第 27 行的
mov al, 1h
部分不断收到错误。我尝试了 mov ah, 1h
。我尝试了mov ah, 01h
,但又失败了。
.model small
.stack 100h
.data
prompt db '0 ile 9 arasinda bir sayi girin:', 0DH, 0AH, '$'
mesaj_1 db 'Girdiginiz sayi çok küçük', 0DH, 0AH, '$'
mesaj_2 db 'Girdiginiz sayi çok büyük', 0DH, 0AH, '$'
mesaj_3 db 'Dogru tahmin\\\! Tebrikler\\\!', 0DH, 0AH, '$'
mesaj_4 db 'Oyuncu Tanitimi', 0DH, 0AH, '$'
.code
start:
; Veri segmenti kayitlarini ayarlama
mov ax, @data
mov ds, ax
; Oyuncu tanitim mesajini görüntüleme
mov dx, offset mesaj_4
mov ah, 9h
int 21h
; Rastgele sayi üretme fonksiyonunu çagir
call rand_num
; Kullanicidan karsilastirma degerini alma (tek haneli sayi varsayilir)
mov al, 1h; Karakter giris kesmesi (sistemlere göre degisebilir)
int 21h ; Kesmeyi baslatma
; Karsilastirma degerini CL'ye saklama
mov cl, al ; AL'yi (giris) CL'ye tasima
; -- Giris döngüsü baslangici ---
döngü:
; Istemi görüntüleme
mov dx, offset prompt
mov ah, 9h
int 21h
; Kullanici girisini okuma
mov ah, 01h ; Karakter giris kesmesi (sistemlere göre degisebilir)
int 21h ; Kesmeyi baslatma
; ASCII girisini sayisal degere dönüstürme
sub al, 30h ; Sayisal degeri elde etmek için '0' (0'in ASCII degeri) çikarma
; Geçerli girisi kontrol etme (0-9)
cmp al, 0 ; 0 ile karsilastirma
jl invalid ; 0'dan küçükse (geçersiz) atlama
cmp al, 9 ; 9 ile karsilastirma
jg invalid ; 9'dan büyükse (geçersiz) atlama
; Girilen sayiyi karsilastirma degeriyle karsilastirma
cmp al, cl
jl smaller ; Küçükse atlama
jg bigger ; Büyükse atlama
je correct ; Esitse atlama
; -- Giris döngüsü sonu ---
invalid:
; Geçersiz giris için hata mesaji görüntüleme
mov dx, offset mesaj_5
mov ah, 9h
int 21h
; Geçerli giris almak için döngüye geri dön
jmp döngü
smaller:
; Daha küçük sayi için mesaji görüntüleme
mov dx, offset mesaj_1
mov ah, 9h
int 21h
jmp döngü ; Döngüye geri dön
bigger:
; Daha büyük sayi için mesaji görüntüleme
mov dx, offset mesaj_2
mov ah, 9h
int 21h
jmp döngü ; Döngüye geri dön
correct:
; Dogru tahmin için mesaji görüntüleme
mov dx, offset mesaj_3
mov ah, 9h
int 21h
; Oyunu bitirme
mov ah, 4ch ; Program sonlandirma kesmesi (sistemlere göre degisebilir)
int 21h
; -- Rastgele sayi üretme fonksiyonu ---
rand_num:
mov ax, 1345h ; Seed degeri (degistirilebilir)
int 21h ; Kesmeyi baslat (DOS için)
mov bx, ax ; Rastgele sayiyi BX'e tasi
ret ; Fonksiyondan dön
; -- Hata mesaji ---
mesaj_5 db 'Geçersiz bir sayi gir
(27) 错误参数:MOV al, 1h
(27) 十六进制可能没有零前缀;或没有“h”后缀;或地址错误;或未定义的变量:1h ”“
我不断收到这些错误。
第 27 行
部分出现错误。我尝试过mov al, 1h
。mov ah, 1h
奇怪的是,你说你尝试过将
ah
换成 al
。任何 DOS 功能的功能号必须强制放置在 AH 寄存器中。无需猜测。
; Kullanicidan karsilastirma degerini alma (tek haneli sayi varsayilir) mov al, 1h; Karakter giris kesmesi (sistemlere göre degisebilir) int 21h ; Kesmeyi baslatma
; Kullanici girisini okuma mov ah, 01h ; Karakter giris kesmesi (sistemlere göre degisebilir) int 21h ; Kesmeyi baslatma
令我立即震惊的是,有问题的行是程序中唯一在指令之后直接开始尾部注释的行,因此没有中间的空格。
emu8086 以其许多错误而闻名,因此我不会对这是错误消息的原因感到惊讶。
我建议你坚持
mov ah, 01h ; Comment
。
关于猜数字游戏的主题。用户永远无法猜出数字,因为
cmp al, cl
指令正在比较不在同一级别的项目!因此,您已将 AL 中用户的猜测从字符 ["0","9"] 转换为数字 [0,9],但是 CL 寄存器仍然包含初始输入中未转换的字符。
; -- Rastgele sayi üretme fonksiyonu --- rand_num: mov ax, 1345h ; Seed degeri (degistirilebilir) int 21h ; Kesmeyi baslat (DOS için) mov bx, ax ; Rastgele sayiyi BX'e tasi ret ; Fonksiyondan dön
我只能部分理解这些注释,因为它们不是英文的,但我很确定这段代码与随机数或其种子无关。 DOS函数13h用于基于文件控制块(FCB)删除文件。最好从您的程序中删除它。