Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编8086:系统时间的奇怪行为_Assembly_Time_Delay_Sleep_X86 16 - Fatal编程技术网

Assembly 汇编8086:系统时间的奇怪行为

Assembly 汇编8086:系统时间的奇怪行为,assembly,time,delay,sleep,x86-16,Assembly,Time,Delay,Sleep,X86 16,我正在汇编8086中编写一个延迟函数。为此,我使用系统时间。首先我重置时间,然后循环,直到系统时间等于或大于我想要等待的时间 这应该不是很难。 这就是我的延迟程序: delay_using_time PROC NEAR push bp mov bp, sp push ax push bx push cx push dx ; Set system time (CH = Hour, CL = minute, DH = second, DL = 1/100 sec) mov ah, 2Dh

我正在汇编8086中编写一个延迟函数。为此,我使用系统时间。首先我重置时间,然后循环,直到系统时间等于或大于我想要等待的时间

这应该不是很难。 这就是我的延迟程序:

delay_using_time PROC NEAR
push bp    
mov bp, sp

push ax
push bx
push cx
push dx

; Set system time (CH = Hour, CL = minute, DH = second, DL = 1/100 sec)
mov ah, 2Dh
xor cx, cx  ; Now CH = 0 = CL
xor dx, dx  ; DX = 0 = DH = DL 
int 21h

; We check that the reset did not failed
CMP al, 0  ; Als al = 255 dan is het setten van de system time mislukt
JNE exit_delay

mov bl, [bp+4][0] ; We put the argument in BL --> wait time

; Debug --> Prints always 0 (so reset was succesfull)
mov dl, dh 
xor dh, dh
push dx
call tprint

; Loop untill DL = wait time, but the problem is DL is immediately bigger
compareTime:
mov ah, 2Ch
int 21h      ; #sec in DH, #1/100 sec in DL

; For debug --> I print the number of seconds passed since we reset the time
mov dl, dh 
xor dh, dh
push dx
call tprint

; If #seconds < wait time (argument) --> loop again until #seconds >= wait time 
CMP dl, bl    

JL compareTime 
JMP exit_delay

exit_delay:
pop dx
pop cx
pop bx
pop ax

mov sp, bp
pop bp 
ret 2
delay_using_time ENDP
使用\u time PROC NEAR延迟\u
推动bp
莫夫英国石油公司
推斧
推bx
推送cx
推送dx
; 设置系统时间(CH=小时,CL=分钟,DH=秒,DL=1/100秒)
mov啊,2Dh
异或cx,cx;现在CH=0=CL
异或dx,dx;DX=0=DH=DL
int 21h
; 我们检查重置是否没有失败
CMP-al,0;Als al=255 dan是系统时间的最小值
退出延迟
动产下限[bp+4][0];我们将参数放入BL-->等待时间
; 调试-->始终打印0(因此重置成功)
莫夫迪勒,dh
异或dh,dh
推送dx
呼叫tprint
; Loop untill DL=等待时间,但问题是DL立即变大
比较时间:
mov-ah,2Ch
int 21h#DH为秒,DL为1/100秒
; 对于调试-->我打印自重置时间以来经过的秒数
莫夫迪勒,dh
异或dh,dh
推送dx
呼叫tprint
; 如果#秒<等待时间(参数)-->再次循环直到#秒>=等待时间
CMP dl,bl
JL比较时间
JMP退出延迟
退出延迟:
波普dx
流行音乐
波普bx
爆斧
英国石油公司
波普bp
ret 2
使用时间ENDP延迟
但是我的延迟程序不起作用。所以我把显示器放进去,看看问题出在哪里

首先,我显示重置系统时间后的秒数。它显示0,因此系统时间已正确重置。之后,在循环中,我显示自重置系统时间以来经过的秒数。当我作为参数3传递时,我希望像这样的1,1,…,1,2,2,3会显示出来(所以我想延迟3秒钟)。 (每个数字显示多次,因为它正在循环,并且每秒循环多次)

但是当我测试我的过程时,我看到每次调用delay时循环只执行一次 因此,它直接显示例如“54”,而不是1,2,3,…,54(我们所期望的)

有人能告诉我为什么会这样吗?我真的不明白,我首先重置系统时间并显示它以确保它被重置,然后在循环中显示秒数。因此秒数立即从0(当我重置它时)跳到例如54。


谢谢你的帮助

我昨晚试过你的代码,它运行正常。我得到了数千个零、一、二和一个三。
如果函数2Dh的退出值不是0,那么您的程序显然可以只运行1次。在实际DOS下,退出值应仅为0或255。你有没有试过和255比较,如果相等的话就跳?此外,由于没有作为调试辅助正确重置时间,您可以区分正常退出和退出。也许是嘟嘟声

这一评论并不完全正确

; Debug --> Prints always 0 (so reset was succesfull)
您可以打印您在DH注册表中输入的原始0


都是多余的。

为什么要先用ah=2d设置时间?另外,我不确定是否有任何gettime调用会破坏任何寄存器。此外,您还可以使用mov dl,dh来破坏dl。@bestsss我首先将时间设置为午夜(小时、分钟、秒和百分百为零),因为我将延迟/睡眠的时间作为参数传递给函数。因此,一旦我将时间重置为午夜,我所要做的就是检查时间,并将秒数(重置后经过的时间)与传递给过程的参数进行比较。如果时间过了<我再次循环参数。所以我一直循环直到时间过去>=参数。是的,获取时间将结果放入CX和DX寄存器:CH=小时CL=分钟DH=秒DL=1/100秒。设置时间信息:@bestsss I使用mov dl销毁dl,dh,因为我想将秒数(dh)传递给将显示参数的过程(是通过堆栈传递的数字)。因此,如果我将DX推到堆栈上,显示的数字将是错误的,因为DX=(DH DL)。因此,为了正确显示秒数(dh),我将dh复制到DL中。然后清除DH(xor DH,DH),这样当它将显示DX的内容时,它将实际显示DL(因为DH为零,因此不会改变DL的值)。很抱歉,我的评论有两个,但是要放进一个评论太长了。事实上,当我用秒的时候,它可以正常工作。但是当我尝试延迟1/100秒,比如500秒,它的行为很奇怪。因此,我所做的更改是打印dl的值,而不是dh(因此显示1/100秒)。我还比较了dl和bl,而不是dh和bl(比较秒)。因此,如果我们将其作为参数5传递(等待500秒),我们会期望它像秒一样显示“000..0111..122..233..344..455..5”。但显示的数字立即像56。是否比计时器的精度限制低5/100秒?MS-DOS返回的百分之一百秒的值基于BIOS计时器滴答声,其工作速度为每秒18.2滴答声。因此分辨率约为55毫秒。我运行了您的代码的修改版本,并在1秒内以DL的形式获得了这些值(每个数字在一行中出现了很多次)。0,5,10,16,21,27,32,38,43,49,54,60,65,71,76,82,87,93,98,4 5或6的增加对应于100/18。简而言之,MS-DOS试图给出一个非常精确的时间,但硬件不允许。
JMP exit_delay
mov sp, bp