NASM程序集中的Windows API Beep功能

时间:2013-12-13 15:23:06

标签: windows winapi assembly x86-64 nasm

我正在尝试使用NASM程序集中的Windows API,只是对函数和诸如此类的一些基本调用。所以,我去了MSDN网站,了解了Beep功能。它说它需要两个值,包括双字,频率和持续时间。所以这就是我的装配程序的样子:

NULL equ 0 ; null
global _start ; entry point
extern Beep, ExitProcess ; the stuff I need

section .data
    beepfreq dd 37 ; limit of 37 to 32,767
    beepdur dd 300 ; This is in milliseconds

section .bss
    dummy resd 1 ; nothing

section .text
_start:
    push beepfreq ; beep frequency
    push beepdur ; beep duration
    call Beep ; call it

    push NULL
    call ExitProcess

然而,当我运行程序时,蜂鸣声总是听起来一样,并且持续时间超过300毫秒。无论我改变频率或持续时间,它总是听起来都一样。为什么呢?

1 个答案:

答案 0 :(得分:2)

此:

push beepfreq ; beep frequency
push beepdur ; beep duration
call Beep ; call it

应该是:

push dword [beepdur] 
push dword [beepfreq] 
call Beep ; call it

首先;参数从右向左推(即函数的第一个参数应该最后推)。 其次;在NASM语法中push beepfreq表示“push地址beepfreq”(如MASM / TASM语法中的push OFFSET beepfreq)。要获取该地址的值,请使用括号。