汇编语言——music(《送别》bgm)

完整代码

NOTE_1  =  440 ; 音调频率
NOTE_2  =  495
NOTE_3  =  550
NOTE_4  =  587
NOTE_5  =  660
NOTE_6  =  733
NOTE_7  =  825ONE_BEEP  =  600 ; 一拍延时600ms
HALF_BEEP =  300 ; 半拍延时300msdata segment
ticks dw 0
music dw  NOTE_5, ONE_BEEP
dw  NOTE_3, HALF_BEEP
dw  NOTE_5, HALF_BEEP
dw  NOTE_1*2, ONE_BEEP*2
dw  NOTE_6, ONE_BEEP
dw  NOTE_1*2, ONE_BEEP
dw  NOTE_5, ONE_BEEP*2
dw  NOTE_5, ONE_BEEP
dw  NOTE_1, HALF_BEEP
dw  NOTE_2, HALF_BEEP
dw  NOTE_3, ONE_BEEP
dw  NOTE_2, HALF_BEEP
dw  NOTE_1, HALF_BEEP
dw  NOTE_2, ONE_BEEP*4
dw  NOTE_5, ONE_BEEP
dw  NOTE_3, HALF_BEEP
dw  NOTE_5, HALF_BEEP
dw  NOTE_1*2, HALF_BEEP*3
dw  NOTE_7, HALF_BEEP
dw  NOTE_6, ONE_BEEP
dw  NOTE_1*2, ONE_BEEP
dw  NOTE_5, ONE_BEEP*2
dw  NOTE_5, ONE_BEEP
dw  NOTE_2, HALF_BEEP
dw  NOTE_3, HALF_BEEP
dw  NOTE_4, HALF_BEEP*3
dw  NOTE_7/2, HALF_BEEP
dw  NOTE_1, ONE_BEEP*4
dw  NOTE_6, ONE_BEEP
dw  NOTE_1*2, ONE_BEEP
dw  NOTE_1*2, ONE_BEEP*2
dw  NOTE_7, ONE_BEEP
dw  NOTE_6, HALF_BEEP
dw  NOTE_7, HALF_BEEP
dw  NOTE_1*2, ONE_BEEP*2
dw  NOTE_6, HALF_BEEP
dw  NOTE_7, HALF_BEEP
dw  NOTE_1*2, HALF_BEEP
dw  NOTE_6, HALF_BEEP
dw  NOTE_6, HALF_BEEP
dw  NOTE_5, HALF_BEEP
dw  NOTE_3, HALF_BEEP
dw  NOTE_1, HALF_BEEP
dw  NOTE_2, ONE_BEEP*4
dw  NOTE_5, ONE_BEEP
dw  NOTE_3, HALF_BEEP
dw  NOTE_5, HALF_BEEP
dw  NOTE_1*2, HALF_BEEP*3
dw  NOTE_7, HALF_BEEP
dw  NOTE_6, ONE_BEEP
dw  NOTE_1*2, ONE_BEEP
dw  NOTE_5, ONE_BEEP*2
dw  NOTE_5, ONE_BEEP
dw  NOTE_2, HALF_BEEP
dw  NOTE_3, HALF_BEEP
dw  NOTE_4, HALF_BEEP*3
dw  NOTE_7/2, HALF_BEEP
dw  NOTE_1, ONE_BEEP*3
dw  0, 0
data endscode segment
assume cs:code, ds:data, ss:stk
main:mov ax, datamov ds, axxor ax, axmov es, axmov bx, 8*4mov ax, es:[bx]mov dx, es:[bx+2]   ; 取int 8h的中断向量mov cs:old_int8h[0], axmov cs:old_int8h[2], dx; 保存int 8h的中断向量climov word ptr es:[bx], offset int_8hmov es:[bx+2], cs   ; 修改int 8h的中断向量mov al, 36hout 43h, almov dx, 0012hmov ax, 34DCh       ; DX:AX=1193180mov cx, 1000div cx              ; AX=1193180/1000out 40h, almov al, ahout 40h, al         ; 设置时钟振荡频率为1000次/秒stimov si, offset musiccld
again:lodswtest ax, axjz donecall frequencylodswcall delayjmp again
done:climov ax, cs:old_int8h[0]mov dx, cs:old_int8h[2]mov es:[bx], axmov es:[bx+2], dx   ; 恢复int 8h的中断向量mov al, 36hout 43h, almov al, 0out 40h, almov al, 0out 40h, al         ; 恢复时钟振荡频率为1193180/65536=18.2次/秒stimov ah, 4Chint 21hfrequency:push cxpush dxmov cx, ax   ; CX=frequencymov dx, 0012hmov ax, 34DCh; DX:AX=1193180div cx       ; AX=1193180/frequencypop dxpop cxclipush axmov al, 0B6hout 43h, alpop axout 42h, al ; n的低8位mov al, ahout 42h, al ; n的高8位 ; 每隔n个tick产生一次振荡; 振荡频率=1193180/n (次/秒)stiretdelay:push axcliin al, 61hor al, 3out 61h, al; 开喇叭stipop axmov [ticks], ax
wait_this_delay:cmp [ticks], 0jne wait_this_delaycliin al, 61hand al, not 3out 61h, al; 关喇叭stiretint_8h:push axpush dsmov ax, datamov ds, axcmp [ticks], 0je skipdec [ticks]
skip:pop dspop axjmp dword ptr cs:[old_int8h]
old_int8h dw 0, 0
code endsstk segment stack
dw 100h dup(0)
stk ends
end main

music.asm

汇编代码——music(《送别》bgm)相关推荐

  1. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  2. GCC生成的汇编代码

    假设我们写了一个C代码文件 code.c包含下面代码: int accum = 0; int sum(int x, int y) {     int t = x + y;     accum += t ...

  3. C++ 汇编代码查看

    文章目录 gcc 编译为汇编代码 使用 as 展示汇编代码 使用 objdump 进行反汇编 使用 godbolt 可视化结果 gcc 编译为汇编代码 原始C++代码如下: #include &quo ...

  4. 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验目的: 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 实验过程: 通过vi程序进行编程: int g(int x) { return x + 3; } int f(int x) ...

  5. 实验四:汇编代码调用系统调用的工作过程

    钟晶晶 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 工作过程 以41 ...

  6. C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用

    一.vptr的位置 class test { public:int i; virtual void testfunc() {} };int main() {test a;char* p1 = rein ...

  7. 修改vb6的编译器c2.exe使它可以输出汇编代码_xv6笔记-启动代码分析

    首先看xv6 commit的第一个makefile OBJS = main.o CC = i386-jos-elf-gcc LD = i386-jos-elf-ld OBJCOPY = i386-jo ...

  8. C 语言编程 — 结构化程序流的汇编代码与 CPU 指令集

    目录 文章目录 目录 文章目录 为什么要保留汇编语言 顺序程序流 条件程序流 循环程序流 函数调用栈的工作原理 文章目录 <C 语言编程 - GCC 工具链> <C 语言编程 - 程 ...

  9. gdb 查看,执行汇编代码

    用gdb 查看汇编代码, 采用disassemble 和 x 命令. nexti, stepi 可以单步指令执行 如下例: -------------------------------------- ...

  10. 【Android 逆向】IDA 工具使用 ( IDA 32 位 / 64 位 版本 | 汇编代码视图 IDA View-A | 字符串窗口 Strings window )

    文章目录 一.IDA 32 位 / 64 位 版本 二.汇编代码视图 IDA View-A 三.字符串窗口 Strings window 一.IDA 32 位 / 64 位 版本 IDA 安装完毕后 ...

最新文章

  1. Unity提出ProtoRes模型:稀疏可变的输入也能构建完整人体姿态
  2. 设计模式的征途—12.享元(Flyweight)模式
  3. 炼丹秘术:给Embedding插上翅膀
  4. 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁
  5. Python——迭代器的几个高级用法
  6. oracle 控制html输出样式,Oracle之sqlplus输出到html
  7. oracle中to_date函数详解
  8. Linux:sudo命令实例讲解
  9. Mybaits的运行原
  10. 数据结构和算法——八种常用的排序算法------归并排序
  11. 友图自动排料引擎 V1.0 开发指南
  12. 关于html5毕业论文设计任务书,毕业论文设计任务书(精选多篇)
  13. python 皮尔森相关系数(Pearson)
  14. 印象笔记chrome插件 安装 程序包无效
  15. oracle数据库写文件,Oracle对操作系统文件的读写操作
  16. Spring框架学习总结(上)
  17. 计算机联锁论文开题报告,学生论文开题报告评语
  18. 嵌入式开发QT教程-5集 纯代码编写UI界面
  19. 小学五年级年级计算机教学计划,小学五年级信息技术教学计划(精选3篇)
  20. pandas 玩转 Excel 操作总结

热门文章

  1. 基于MVC模型和分层模式完成登录和注册
  2. R语言的merge函数
  3. 灰流丽能无效融合么_912「灰流丽」裁定一览
  4. 复变函数与积分变换(三)学习笔记[复积分,柯西积分公式与高阶导公式]
  5. 手机摄像头的分类,技术指标及工作原理
  6. 为什么新安装的Eclipse不能打开
  7. lambda之reduce函数
  8. 目标检测-Yolo框架
  9. 猜数字游戏穷举法(迅雷水晶矿场中的游戏求解)
  10. 10种常用的软件架构模式