522717502 发表于 2019-9-23 23:00:13

汇编程序用EMU8086不起作用

大佬:
          下面这个程序,在emu8086下不响,我的系统用过WIND 7和10 都不行 ,是不是out端口错误还是系统弄错了?
      大佬们,若是错误的那OUT 和in 在Windows下 怎么才能使用/?

assume cs:codeseg, ds:dataseg, ss:stackseg
dataseg segment
mus_freq dw 262,262,262,196
         dw 330,330,330,262
         dw 262,330,392,392
         dw 349,330,294
         dw 294,330,349,349
         dw 330,294,330,262
         dw 262,330,294,196
         dw 247,294,262,-1
mus_time dw 3 dup(12,12,25,25),12,12,50
         dw 3 dup(12,12,25,25),12,12,50
dataseg ends

stackseg segment
   db 100h dup (0)
stackseg ends

codeseg segment
start:
    mov ax, stackseg
    mov ss, ax
    mov sp, 100h

    mov ax, dataseg
    mov ds, ax

    lea si, mus_freq
    lea di, mus_time

play:
    mov dx,
    cmp dx, -1
    je end_play
    call sound
    add si, 2
    add di, 2
    jmp play

end_play:
    mov ax, 4c00h
    int 21h

;演奏一个音符
;入口参数:si - 要演奏的音符的频率的地址
;         di - 要演奏的音符的音长的地址
sound:
    push ax
    push dx
    push cx

    ;8253 芯片(定时/计数器)的设置
    mov al,0b6h    ;8253初始化
    out 43h,al   ;43H是8253芯片控制口的端口地址
    mov dx,12h
    mov ax,34dch
    div word ptr ;计算分频值,赋给ax。中存放声音的频率值。
    out 42h, al       ;先送低8位到计数器,42h是8253芯片通道2的端口地址
    mov al, ah
    out 42h, al       ;后送高8位计数器

    ;设置8255芯片, 控制扬声器的开/关
    in al,61h   ;读取8255 B端口原值
    mov ah,al   ;保存原值
    or al,3   ;使低两位置1,以便打开开关
    out 61h,al;开扬声器, 发声

    mov dx,        ;保持时长
wait1:
    mov cx, 28000
delay:
    nop
    loop delay
    dec dx
    jnz wait1

    mov al, ah         ;恢复扬声器端口原值
    out 61h, al

    pop cx
    pop dx
    pop ax
    ret

codeseg ends
end start

发表于 2019-9-25 22:51:57

书中用什么工具,你就用什么工具。这个软件好像有个毛病,必须生成com格式的文件,必须加org 0x100,我也不太确定。还是用masm或者nasm吧。

522717502 发表于 2019-9-27 10:44:17

SВ 发表于 2019-9-25 22:51
书中用什么工具,你就用什么工具。这个软件好像有个毛病,必须生成com格式的文件,必须加org 0x100,我也不 ...

感谢大佬!!!

522717502 发表于 2019-9-27 10:46:08

SВ 发表于 2019-9-25 22:51
书中用什么工具,你就用什么工具。这个软件好像有个毛病,必须生成com格式的文件,必须加org 0x100,我也不 ...

这个响铃程序的 mov cx,28000 这句我真是服了!28000多次循环

发表于 2019-9-27 13:43:57

522717502 发表于 2019-9-27 10:46
这个响铃程序的 mov cx,28000 这句我真是服了!28000多次循环

测试的时候可以改成一两次,程序通过了就不影响。另外一般调试器支持跳过一个函数,称为step over,https://blog.csdn.net/huangfei711/article/details/51220382
页: [1]
查看完整版本: 汇编程序用EMU8086不起作用