关山可越 发表于 2020-5-11 11:56:14

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

问题如题;
具体代码作用是这样的:
程序开始运行时在屏幕上随机跳动一组一组十位数字的号码,敲空格时停止,得到的号码是幸运号。
这里部分代码是参考了王爽老师汇编书的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:
                pop ds:
                push es:
                pop ds:                        ;将原来的int 9中断例程的入口地址保存在ds:0/ds:2单元中
               
                mov word ptr es:,offset int9
                mov es:,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:
                pop es:
                push ds:
                pop es:
               
        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:~ss中
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:,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:
               
                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
这是怎么回事啊。
希望有大佬可以解答

关山可越 发表于 2020-5-11 13:12:15

顶顶,没有大佬嘛?呜呜呜

关山可越 发表于 2020-5-11 15:56:00

有大佬吗?
页: [1]
查看完整版本: 8086汇编程序在dosbox运行时提示出现下面问题,但是感觉语法上完全没错,求解答