我无法修复代码中的错误? (EMU8086)

问题描述 投票:0回答:1

我正在编写一个猜数字游戏,但我在第 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 ”“

我不断收到这些错误。

assembly syntax x86-16 emu8086
1个回答
0
投票

第 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)删除文件。最好从您的程序中删除它。

© www.soinside.com 2019 - 2024. All rights reserved.