|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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
这是怎么回事啊。
希望有大佬可以解答 |
|