求延时5秒的汇编语言代码

ignited3 2012-12-29 02:15:35
延时5秒与cpu主频无关,请告诉我时间的计算方法
...全文
1623 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjb955201 2013-01-03
  • 打赏
  • 举报
回复
mov ax, 1000 wait1: mov dx, 1000 wait2: dec dx jnz wait2 dec ax jnz wait1 就是这个框架了,要根据CPU的时钟频率,修改ax和dx寄存器的内容。
dylwx 2012-12-31
  • 打赏
  • 举报
回复
rdtsc 这就是核心代码。
dylwx 2012-12-31
  • 打赏
  • 举报
回复
利用Rdtsc指令计算CPU的时钟频率 ; 文件名:Cpu.Asm ; Dos下 .Com 格式文件 .model tiny .586 .code org 100h start: lea dx,Message ;显示信息 mov ah,9 int 21h xor ax,ax mov ds,ax mov ebx,ds:[46ch] ;取时间,每55ms该值自动增1 rdtsc mov esi,eax mov edi,edx mov ecx,ebx bb: cmp ecx,ds:[46ch] jz bb mov ecx,ds:[46ch] rdtsc push ecx sub ecx,ebx sub eax,esi sbb edx,edi push eax push edx mov eax,55000 mul ecx mov ecx,eax pop edx pop eax div ecx call dispax pop ecx mov eax,ecx sub eax,ebx cmp ax,500 ;约30秒后自动退出 ja Over mov ah,1 ;检测是否有按键 int 16h jz bb mov ah,0 ;有,则读按键 int 16h Over: mov ah,4ch ;程序结束 int 21h ; 显示AL代表的ASCII码字符 dispc proc NEAR PUSH AX PUSH DX MOV AH,2 MOV DL,AL INT 21H POP DX POP AX RET dispc endp ;以十进制的形式显示AX的值,显示所占的位数为CX ;若CX的值小于数据的实际宽度则按实际宽度输出 dispax proc near push ax push bx push cx push dx push bp mov cx,5 ;输出数据宽度5位 mov bx,0 ;记录数据实际宽度 mov bp,10 ;十进制 disp1: xor dx,dx div bp inc bx ;显示数据的位数增1 push dx ;保存余数 cmp ax,0 ;商为0 ? jnz disp1 ;没,继续! sub cx,bx ;要求宽度和实际宽度比较 jle disp3 mov al,' ' ;宽度不够,前面补空格 disp2: call dispc loop disp2 disp3: mov cx,bx ;数据的实际位数送CX disp4: pop ax ;依次从堆栈中取数并显示 and al,0fh add al,'0' call dispc loop disp4 call SetPos pop bp ;恢复寄存器的原值 pop dx pop cx pop bx pop ax ret dispax endp SetPos proc near ;调整光标位置 push ax push dx push ds push cs pop ds lea dx,Back mov ah,9 int 21h pop ds pop dx pop ax ret SetPos endp Even Message db 13,10,'Press any key to STOP !',13,10,13,10 db 'Cpu Speed: MHz',8,8,8,8 Back db 8,8,8,8,8,'$' end start ;-------------------------------------------------------------- 编译链接 D:\Masm615>ml Cpu.asm Microsoft (R) Macro Assembler Version 6.15.8803 Patched for you by promethee [ECL] in the year 2001 - enjoy Copyright (C) Microsoft Corp 1981-2000. All rights reserved. Assembling: Cpu.asm Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994 Copyright (C) Microsoft Corp 1984-1993. All rights reserved. Object Modules [.obj]: Cpu.obj /t Run File [Cpu.com]: "Cpu.com" List File [nul.map]: NUL Libraries [.lib]: Definitions File [nul.def]: D:\Masm615>Cpu Press any key to STOP ! Cpu Speed: 1000 MHz D:\Masm615>_
WJN92 2012-12-31
  • 打赏
  • 举报
回复
用定时器做,比较好
HMGuardian 2012-12-31
  • 打赏
  • 举报
回复
想要与主频无关,似乎不太可能,就算是定时器也需要输入频率啊,这输入频率还是和主频或多或少的有些关系的……
ignited3 2012-12-29
  • 打赏
  • 举报
回复
我是说x86下的汇编语言,求代码求解释,你们说的我都不懂
O丸子爹O 2012-12-29
  • 打赏
  • 举报
回复
若是高级语言,比如VS,就能用GetTickCount()来精确延时5s了。 其实只要能读出当前时间的精确值,比如直接读BIOS时间,那么就能实现比较精确的5s延时了。 不同的CPU在读精确时间的函数上应该是一样的吧。
子善旬 2012-12-29
  • 打赏
  • 举报
回复
等待分为 忙等待 和 睡眠等待(可能这个称呼不很贴切) 忙等待 有2中办法:1)计算指令数,再乘cpu hz 2)不断的获取时钟寄存器值,再做检查 睡眠等待 必定与定时器有关
lr2131 2012-12-29
  • 打赏
  • 举报
回复
平台是X86的吗,这个我帮不上忙,我也不记得X86的汇编了,现在用ARM的多,用ARM汇编写延时倒是没太大问题。 可以给你一个建议: 虽然你担心程序在不同主频下延时不一样,但这里面一定是个比例关系。打个比方,你的代码是在主频为1GHz下的延时,这个参数你延时是5S。但换到2GHZ下,程序不改动的话,延时是2.5秒。 所以换了主频后,程序中的主频用宏定义好后,换了平台,对应的改一下再编译就行了。 我想要是能在汇编代码中获取到当前的主频,那么就可以做成自适应的效果,自动按比例改变延时程序内部的计数量,效果也就是你要的和主频无关一样。
ignited3 2012-12-29
  • 打赏
  • 举报
回复
引用 1 楼 lr2131 的回复:
用汇编做延时5S,怎么可能和主频无关呢,你计算的时候一定要注意当前的CPU的频率的呀。除非,你用的外设定时器,设置为5S的中断(其实和主频还是有那么点关系的),但要是这样,用汇编有什么好处吗。你如果是用操作系统的延时的话,那也不需要用汇编呀。不知道LZ什么意思,或者是我搞错了。
是这样的,我做微机原理课程设计用到了延时程序,由于要在机房验收程序,我担心会因为cpu主频不同导致延时不准。 这样吧,与cpu主频有关的程序也可以,并且教给我计算原理就可以了
lr2131 2012-12-29
  • 打赏
  • 举报
回复
用汇编做延时5S,怎么可能和主频无关呢,你计算的时候一定要注意当前的CPU的频率的呀。除非,你用的外设定时器,设置为5S的中断(其实和主频还是有那么点关系的),但要是这样,用汇编有什么好处吗。你如果是用操作系统的延时的话,那也不需要用汇编呀。不知道LZ什么意思,或者是我搞错了。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧