嗨我制作了旋转两个符号的程序 - \和/但我不知道如何在嵌套循环中设置cx计数器有人可以给我建议或帮助我吗?
这是该部分的代码
program:
mov ah, 0fh ; function - get video mode
int 10h
push ax ; save number of columns
push bx ; save page number
mov ah, 0 ; function - set video mode
int 10h
mov al, 0003h ;set video mode
int 10h
mov cx,10d ; Outer loop counter how many symbols rotate
mov bx,50d ; this is for delay loop
OuterLoop:
push cx
mov ah,02h
mov bh, 0 ;cursor set
mov dh, 2
mov dl, 10
int 10h
mov AH,0Ah
mov al,"/" symbol /
mov bh,0
mov cx,1
int 10h
mov cx,bx
call Delay ;delay loop
sub bx,15d
mov ah,02h
mov bh, 0
mov dh, 2 cursor set
mov dl, 10
int 10h
mov AH,0Ah
mov al,"\" ;symbol \
mov bh,0
mov cx,1
int 10h
mov cx,bx
call Delay ; another delay
sub bx,10
pop cx ; Restore current CX
loop OuterLoop
jmp START ; and after end it should jump to start where is menu with choices
它应该像这样工作
写/ 延迟例如10秒 写\ 延迟8秒 并跳转到开始和循环
感谢您的建议
这是我的延迟程序
Delay PROC NEAR ;
push ds ;
push si ;
push ax ;
xor ax, ax ;AX = 0
mov ds, ax ;DS = 0
mov si, 046Ch ;
t1: mov ax, [si] ;
t2: cmp ax, [si] ;
je t2 ;
loop t1 ;
pop ax ;
pop si ;
pop ds ;
ret ;
Delay ENDP ;
我仍在使用此应用程序,但它无法正常工作我需要的是这个步骤
程序:循环开始 \ 延迟延迟100次 / 延迟延迟80次 环 并且在每次循环之后减少延迟,如此100次80,60,40等等,但我不知道在哪里放推和弹出cx因为我的延迟程序正在使用cx。我只是将cx设置为100,它会延迟,等等。
答案 0 :(得分:1)
我看到两个问题:
首先,bx
在此初始化
mov bx,50d ; this is for delay loop
然后它被
覆盖了mov bh, 0
bh
是bx
其次,在延迟过程中,是什么修改了[si]
处的位置,以便je t2
分支通过?因为它是一个无限循环:
xor ax, ax ;AX = 0
mov ds, ax ;DS = 0
mov si, 046Ch ;
t1: mov ax, [si] ;
t2: cmp ax, [si] ;
je t2 ;
loop t1 ;
<强>更新强> 我发现地址0x46c是包含时间信息的BIOS地址。
http://www.osdata.com/system/physical/lowmem.htm
因此,您在该循环中观看的内存是BIOS更新的位置,计时器滴答计数器(每54.9毫秒计数),请参阅
所以为了回答你的问题,在调用你的Delay
程序之前,你应该加载CX
你希望延迟的BIOS滴答数(以毫秒为单位的时间除以54.9)。
答案 1 :(得分:0)
为了绘制我自己的光标,我使用定时器中断在不同的高性能CPU上变得更加稳定。
Cursor_Speed = 7
;-------------DATA--------------------------------------
CURFLAG DB 0, 0, 0, 0
ALTVEC DD 0
;-------------CODE--------------------------------------
cli
xor ax, ax
mov es, ax
mov ebx, DWORD PTR es:[8*4] ; Get the old Vector (Offset/Segment)
mov DWORD PTR[ALTVEC], ebx ; save it
mov cs:DWORD PTR[OLDVEC], ebx
mov es:[8*4], OFFSET NEWVEC ; Set the new IRQ-Vector
mov es:[(8*4)+2], cs
mov al, 36h ; Set 18,2 Hertz(Standard)
out 43h, al
xor al, al
out 40h, al ; low
out 40h, al ; high
sti
;---------------------------------------------------
......
;---------------------------------------------------
NEWVEC: inc BYTE PTR[CURFLAG+1]
cmp BYTE PTR[CURFLAG+1], Cursor_Speed
jb short NOHIT
mov BYTE PTR[CURFLAG+1], 0
xor BYTE PTR[CURFLAG], 1
NOHIT: DB 0EAh ; jmp far
OLDVEC DD 0
;---------------------------------------------------
...
另外,我们可以等待使用轮询端口3DAh的vsinc来减少预设延迟。
德克