鱼C论坛

 找回密码
 立即注册
查看: 2988|回复: 2

8086汇编程序在dosbox运行时提示出现下面问题,但是感觉语法上完全没错,求解答

[复制链接]
发表于 2020-5-11 11:56:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题如题;
具体代码作用是这样的:
程序开始运行时在屏幕上随机跳动一组一组十位数字的号码,敲空格时停止,得到的号码是幸运号。
这里部分代码是参考了王爽老师汇编书的15.4章节里面的代码,具体是利用了9号中断处理接收到的空格字符
```
assume cs:code

stack segment
db 128 dup (0)
stack ends

data segment
dw 0,0
data ends

code segment
start:         mov ax,stack
                mov ss,ax
                mov sp,128
               
                mov ax,data
                mov ds,ax
               
                mov ax,0
                mov es,ax
               
                push es:[9*4]
                pop ds:[0]
                push es:[9*4+2]
                pop ds:[2]                        ;将原来的int 9中断例程的入口地址保存在ds:0/ds:2单元中
               
                mov word ptr es:[9+4],offset int9
                mov es:[9*4+2],cs        ;在中断向量表中设置新的int 9中断历程的入口地址
               
                mov ax,0b800h
                mov es,ax
  roll:        call rand
                call display
                call delay
                jmp short roll
               
  quit:        mov ax,0
                mov es,ax
               
                push ds:[0]
                pop es:[9*4]
                push ds:[2]
                pop es:[9*4+2]
               
          mov ax,4c00h
                int 21h
;======================================================================================
rand proc near       
                push bx                ;sp=126
                push dx                ;sp=124
                push cx                ;sp=122
                push si                ;sp=120
                mov cx,10
                mov si,64
                mov sp,si
  rdm:  sti
                mov ah,0        ;读时钟计数器值:ah=0;则cx:dx=时钟“滴答”计数
                int 1ah                ;此时dx中值已改变
                cli
                mov ax,dx        ;将改变过的dx值赋给ax
                and ah,3
                mov dl,10        ;dl赋值10
                div dl                ;除以10,产生0~9的余数
                mov al,ah       
                mov ah,0    ;余数存ax,做随机数
                add ax,30h        ;将ax中的余数转变为对应的ascii码值
                push ax                ;将ax中的ascii码值压入栈中
                                        ;(不能直接入栈,否则后面弹栈的dx等寄存器会数据错误
                loop rdm
                mov si,120
                mov sp,si
                pop si
                pop cx
                pop dx
                pop bx                ;按顺序出栈相关寄存器
                ret
rand endp
;======================================================================================
;相关的10个0~9的数字的ascii码值已存入ss:[44]~ss[63]中
display proc near
                push cx
                push ax
                push si
                push di                ;sp=120
                mov cx 10                      这里是第一个错误,显示error A2028:         Operter expected
                mov di,36
                mov si,44
                mov sp,si
   lop:        pop ax
                mov es:[160*12+di*2],ax                第二个错误:error A2055: Illegle register value     ;将ax中的ascii码值交由显示器在正中显示
                add di,2                                        ;10个数字依次显示(由于电脑运行速度较快会显示同时进行0
                loop lop
                mov si,120        ;恢复sp的指向
                mov sp,si
                pop di
                pop si
                pop ax
                pop cx
;======================================================================================
delay proc near
                push ax
                push dx
                mov dx,1000h
                mov ax,0
   s1:  sub ax,1
                sbb dx,0
                cmp ax,0
                jne s1
                cmp dx,0
                jne s1
                pop dx
                pop ax
                ret
;======================================================================================
int9 proc near
                push ax
                push bx
                push es
               
                pushf
                pushf
                pop bx
                and bh,11111100b
                push bx
                popf
                call dword ptr ds:[0]
               
                mov ah,01
                int 21h
                cmp al,20h
                jnz int9ret
               
                jmp far quit        第3个错误:error A2028:Operator expected
               
int9ret:pop es
                pop bx
                pop ax
                iret
               
code ends
end start               

```
代码如上

这三个是dosbox显示的错误,但是我怎么也看不出来哪里有问题,而且dosbox明明只显示了这3个错误,却在下面提示了6个错误
:6 Severe Errors
这是怎么回事啊。
希望有大佬可以解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-11 13:12:15 | 显示全部楼层
顶顶,没有大佬嘛?呜呜呜
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-11 15:56:00 | 显示全部楼层
有大佬吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 20:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表