| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
大佬: 
          下面这个程序,在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, [si] 
    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 [si] ;计算分频值,赋给ax。[si]中存放声音的频率值。 
    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, [di]       ;保持[di]时长 
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 
书中用什么工具,你就用什么工具。这个软件好像有个毛病,必须生成com格式的文件,必须加org 0x100,我也不太确定。还是用masm或者nasm吧。 
 
 
 |   
 
 
 
 |