1)我是iPhone开发人员,但需要在汇编方面做一些工作,我必须使用汇编语言编写代码来生成声音(假设发出哔哔声)
2)然后我必须将此.asm文件转换为.hex文件并将其写入编程IC 2051之后,我必须将其连接到生成声音的硬件(我有)
我坚持第一部分,任何帮助将受到高度赞赏,因为我被困在其中几周
以下是我的示例代码
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
MOV DX,2000 ; Number of times to repeat whole routine.
MOV BX,1 ; Frequency value.
MOV AL, 10110110B ; The Magic Number (use this binary number only)
OUT 43H, AL ; Send it to the initializing port 43H Timer 2.
NEXT_FREQUENCY: ; This is were we will jump back to 2000 times.
MOV AX, BX ; Move our Frequency value into AX.
OUT 42H, AL ; Send LSB to port 42H.
MOV AL, AH ; Move MSB into AL
OUT 42H, AL ; Send MSB to port 42H.
IN AL, 61H ; Get current value of port 61H.
OR AL, 00000011B ; OR AL to this value, forcing first two bits high.
OUT 61H, AL ; Copy it to port 61H of the PPI Chip
; to turn ON the speaker.
MOV CX, 100 ; Repeat loop 100 times
DELAY_LOOP: ; Here is where we loop back too.
LOOP DELAY_LOOP ; Jump repeatedly to DELAY_LOOP until CX = 0
INC BX ; Incrementing the value of BX lowers
; the frequency each time we repeat the
; whole routine
DEC DX ; Decrement repeat routine count
CMP DX, 0 ; Is DX (repeat count) = to 0
JNZ NEXT_FREQUENCY ; If not jump to NEXT_FREQUENCY
; and do whole routine again.
; Else DX = 0 time to turn speaker OFF
IN AL,61H ; Get current value of port 61H.
AND AL,11111100B ; AND AL to this value, forcing first two bits low.
OUT 61H,AL ; Copy it to port 61H of the PPI Chip
; to turn OFF the speaker.
答案 0 :(得分:2)
发布的链接是关于x86硬件和8255 PPI - 鉴于您的硬件,这两者都不是您感兴趣的。作为如何在硬件上执行此操作的示例,您的“示例代码”对您没什么用处,它是不同的指令集和不同的硬件。此外,在任何情况下,它都是一种非常粗糙且在CPU中非常昂贵的产生声音的方法。
你的芯片有两个16位定时器/计数器,每个可以直接驱动一个引脚 - 你不需要汇编器;你也可以使用高级语言(C最适合该平台)。无论哪种方式,您都可以简单地编程一个定时器,以所需的频率输出信号,运行时软件开销为零,然后在所需的时间段后停止定时器(您可以使用第二个定时器/计数器)。
如果必须使用汇编程序,那么首先需要学习8051指令集,然后根据您将使用的汇编程序/链接程序工具链,会有轻微的语法和指令差异。其次,您需要熟悉零件和电路板的硬件规格,并了解扬声器如何与其连接和驱动。
基本上你选择以不相关的信息作为起点从错误的地方开始。
我对AT89C2051并不熟悉,因为我使用了任何类型的MCS-51已经很长时间了,但它可能无法使用硬件PWM,在这种情况下你可以切换GPIO引脚。定时器中断,如汇编程序和C示例here中所述。无论哪种方式,这些示例都非常接近您目前正在尝试使用的内容!