From: Frank Kotler <fbkotler@comcast.net>
To: joy_mm@ieee.org
Cc: linux-assembly@vger.kernel.org
Subject: Re: Segfault on ioperm
Date: Fri, 21 Jan 2005 09:29:01 -0500 [thread overview]
Message-ID: <41F111AD.7A2283BA@comcast.net> (raw)
In-Reply-To: 4b0d6e0d050121044310b6a9c6@mail.gmail.com
joy merwin monteiro wrote:
> > > mov eax,101
> > > mov ebx,port
> > > mov ecx,3
> >
> > This is the number of ports you're enabling, right?
> >
> > > mov edx,port
> >
> > And this should be the "turn-on" value... I imagine you want
> > "3" here, too, for "in" and "out" permissions...
>
> No idea, Just used the code available on http://www.janw.easynet.be/eng.html
> as a reference. it works fine, so......
Yup. I learn a lot from that page, too. Not "obsolete" at
all, IMO, and your English is fine, too! Thanks, Jan!
In this case, "man 2 ioperm" differs - says "turn on value"
in edx (well... it doesn't say edx...)
> > > out 378h,al <----- segfault here
> >
> > "out dx, al", as Jan suggests...
>
> However, Jan's musice speaker on the site above uses
> "out 43h,al"
Unless I'm mistaken, you can use an "immediate" value for
in/out - but only for the first 255 ports. If the value
exceeds a byte (as 378h does), you have to use dx.
In case it would be of interest to you, or anybody, I'll
include my simple "beep the speaker" example. I make no
claim that this is "right" (certainly not "elegant"), but it
"seems to work". The "delay" routine, for example,
special-cases a duration of 1 (since I want 0 for an
end-of-data marker, "no delay" is 1). This "special case"
should be handled in the "main" part of the code, leaving
the "delay" subroutine more "generic" - just haven't gotten
around to changing it. I'm sure there are other things, too
- any feedback welcome. Since the port numbers are small,
this *does* use immediates on in/out...
Good luck,
Frank
; Plays a tune, of sorts - sound, anyway.
; It is said that I'm not artistic.
;
; nasm -f elf [-g] play.asm
; ld [-s] -o play play.o
;
; to be able to run without being root:
; as root, "chown root:root play" "chmod +s play"
section .text
global _start
_start:
nop ; parking place for gdb
mov eax, 101 ; sys_ioperm
mov ebx, 42h ; starting port
mov ecx, 20h ; how many ports
mov edx, 3 ; read/write
int 80h
test eax, eax
jns okay_ioperm
neg eax
call showeax
mov ebx, eax
jmp exit
okay_ioperm:
; set up PIT
mov al, 10111110b
;.......|------ binary 16-bit counter
;....|||------- square wave generator
;..||---------- r/w bits 0-7, then 8-15
;||------------ select counter 2
out 43h, al
mov esi, melody
playit_sam: ; if she can take it, so can I.
in al, 61h ; enable speaker
or al, 00000011b
;.......|------- enable speaker on timer 2 gate
;......|-------- enable speaker data
out 61h, al
lodsd ; get a note
or eax, eax ; check for zero
jz egress ; coda
out 42h, al ; play it
mov al, ah
out 42h ,al
lodsd ; for this long
call delay
in al, 61h ; Turn Speaker OFF
and al, 11111100b
out 61h, al
lodsd ; for this long
call delay
jmp short playit_sam ; play more
egress:
in al, 61h
and al, 0FCh ; Turn Speaker OFF. Please.
out 61h, al
mov eax, 101 ; sys_ioperm
mov ebx, 42h
mov ecx, 20h
mov edx, 0 ; give back ports
int 80h
test eax, eax
jns okay_exit
neg eax
call showeax
mov ebx, eax
jmp exit
okay_exit:
xor ebx, ebx
exit:
mov eax, 1 ; sys_exit
int 80h
;------------------
;------------------
delay:
push ebx
push ecx
cmp eax, byte 1
jz .no_delay
xor ebx, ebx
.check_ns
cmp eax, 1000000000 ; limit for nanosleep 999999999
ns...
jb .okay_ns
sub eax, 1000000000
inc ebx
jmp short .check_ns
.okay_ns
push eax ; set up a time_spec structure on the stack
push ebx
.take_a_nap
mov eax, 162 ; sys_nanosleep
mov ebx, esp ; same structure for "request"
mov ecx, esp ; and "remaining" - does this work?
int 80h
cmp eax, -4 ; -EINTR
jz .take_a_nap
add esp, byte 8 ; remove time_spec "structure"
.no_delay:
pop ecx
pop ebx
ret
;------------------
;-----------------------------------
; showeax - prints a decimal representation of eax to stdout
; expects - number to print in eax
; returns - nothing
;------------------------------------
showeax:
pushad
xor edi, edi ; counter
mov esi, 10 ; divide by ten
push esi ; double as LF :)
inc edi
.top
xor edx, edx ; zero edx for the divide
div esi ; quotient in eax, remainder in edx
add dl, '0' ; convert number to ascii char
push edx ; save it
inc edi ; bump counter
or eax, eax ; is quotient zero?
jnz .top ; if not, do more
.print
mov eax, 4 ; sys_write
mov ebx, 1 ; stdout
mov ecx, esp ; character's on the stack
mov edx, 1 ; just one
int 80h ; do it
pop edx ; get rid of the character we've
printed
dec edi ; decrement counter
jnz .print ; 'til done
popad
ret
;-----------------------
section .data
; Some equates, for your compositional assistance
; It is said that I'm not artistic.
A0 equ 21728
B0 equ 19328
C0 equ 18244
D0 equ 16144
E0 equ 14080
F0 equ 13668
G0 equ 12176
A1 equ 10864
B1 equ 9664
C1 equ 9122
D1 equ 8072
E1 equ 7040
F1 equ 6834
G1 equ 6088
A2 equ 5432
B2 equ 4832
C2 equ 4561
D2 equ 4063
E2 equ 3520
F2 equ 3417
G2 equ 3044
A3 equ 2712
B3 equ 2416
C3 equ 2280
D3 equ 2032
E3 equ 1810
F3 equ 1708
G3 equ 1522
A4 equ 1356
B4 equ 1208
C4 equ 1140
D4 equ 1016
E4 equ 905
F4 equ 854
G4 equ 762
A5 equ 678
B5 equ 604
C5 equ 558
; Some "durations" for sys_nanosleep
Z equ 1
S equ 60000000
Q equ 120000000
P equ 240000000
R equ 480000000
L equ 1920000000
; The opus itself.
;
; It is said that I'm not artistic.
;
; Format is "note", "duration", "pause", "note", ... , 0
; Write your own!
melody:
dd G2, P, Z, E2, Q, Z, G2, Q, Q, G1, Q, Q
dd G1, Q, Q, C2, Q, Q, B2, Q, Z, C2, Q, Z
dd D2, Q, Q, G2, Q, Q, A3, Q, Z, G2, Q, Z
dd A3, Q, Q, A2, Q, Q, A2, Q, Q, G2, Q, Q
dd E2, Q, Z, G2, Q, Z, F2, Q, Z
dd E2, Q, Z, D2, Q, Q, F2, Q, Z, G2, Q, Z
dd A3, Q, Z, G2, Q, Z, F2, Q, Z, E2, Q, Z
dd F2, Q, Z, E2, Q, Z, D2, Q, Z, B2, Q, Z
dd C2, Q, Z, D2, Q, Z, E2, Q, Z, C2, Q, Z
dd D2, Q, Q, G3, Q, Z, F3, Q, Z, E3, Q, Z
dd D3, Q, Z, C3, Q, Z, B3, Q, Z, A3, Q, Z
dd B3, Q, Z, C3, Q, Z, D3, Q, Z, B3, Q, Q
dd G0, Q, Q, G0, R, Z, 0
next prev parent reply other threads:[~2005-01-21 14:29 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-01-20 13:52 Segfault on ioperm joy merwin monteiro
2005-01-20 14:58 ` Richard Cooper
2005-01-20 15:26 ` Jan Wagemakers
2005-01-20 18:15 ` joy merwin monteiro
2005-01-20 18:40 ` Frank Kotler
2005-01-21 12:43 ` joy merwin monteiro
2005-01-21 14:29 ` Frank Kotler [this message]
2005-01-23 8:35 ` Jan Wagemakers
2005-01-23 8:17 ` Jan Wagemakers
2005-01-24 3:28 ` joy merwin monteiro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41F111AD.7A2283BA@comcast.net \
--to=fbkotler@comcast.net \
--cc=joy_mm@ieee.org \
--cc=linux-assembly@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).