71
Programming with NASM / Re: Deficient value assessment from standard read and write call functions
« Last post by Frank Kotler on January 20, 2024, 08:04:05 AM »I may have missed 32 vs 64 bit sytm calls...
Best,
Ftank
Best,
Ftank
section .data
; pathname dd "/home/Documents/Platforms/Programs/Sources/referenceA2023/Concepts/Codec/DesignII/Test/Base/new.text"
; pathname dd "/home/chris-deb-auth/Documents/Platforms/Programs/Sources/A2024/small_rebuild/new.txt"
; toWrite dd "test text here",0AH,0DH,"$"
; length equ $ - toWrite
filename db "new.txt", 0 ; filename with null terminator
toWrite dd "test text here",10
; message db "Hello, world!", 10 ; message with newline
; msglen equ $ - message ; length of message
length equ $ - toWrite
section .text
global Filer
Filer:
; open the file
mov eax, 2 ; sys_open
; mov ebx, pathname ; pointer to filename
mov ebx, filename ; pointer to filename
mov ecx, 0x201 ; O_WRONLY|O_CREAT
mov edx, 0x1b6 ; 0644
int 0x80 ; call kernel
mov esi, eax ; save file descriptor
; write to the file
mov eax, 4 ; sys_write
mov ebx, esi ; file descriptor
mov ecx, toWrite ; pointer to message
mov edx, length ; length of message
int 0x80 ; call kernel
; close the file
mov eax, 6 ; sys_close
mov ebx, esi ; file descriptor
int 0x80 ; call kernel
; exit the program
mov eax, 1 ; sys_exit
mov ebx, 0 ; exit code
int 0x80 ; call kernel
jmp $
times 510 - ($-($$)) db 0
db 0x55,0xaa
section .data
; pathname dd "~/.../new.text"
pathname dd "new.txt"
toWrite dd "test text here",0AH,0DH,"$"
length equ $ - toWrite
section .text
global Filer
Filer:
;section .data
; pathname dd "/home/Documents/Platforms/Programs/Sources/referenceA2023/Concepts/Codec/DesignII/Test/Base/new.text"
; toWrite dd "test text here",0AH,0DH,"$"
mov eax,5
mov ebx,pathname
mov ecx,101o
mov edx,700o
int 80h
mov ebx,eax
mov eax,4
mov ecx,toWrite
mov edx,17
; mov edx,length
int 80h
jmp $
times 510 - ($-($$)) db 0
db 0x55,0xaa
cmd_prompt1:
call Heap_Buffer
call Encoder
; call Paging
; call Filer
mov byte [Ref_CountA],0
call Parser.Blank
call Parser.Signature_Scan
call Parser.Assignment
call Decoder
call cmp_delta
;task segment prep code
.A:
;push cs
;push .A
push .B
pop word [Ref_Task_1]
;pop cx
;mov word [Ref_Task_1],cx
;call Domain.TaskA
jmp Domain.TaskA
.B:
jmp cmd_buffer
;qqqqqqqqqqq
;native test code skip
;task prep code area
.TaskA:
jmp poll_function
; prep area
; prep area
Ref_Task1: dw 0
;protectedGate1:
;qqqqqqqqqqqq
;preset code
;task segment preset
mov word [Ref_Task1],cx
;cmp word [Ref_Task1],0
cmp cx,0
jz short protectedGate1
jmp TaskA
;qqqqqqqqqqqqq
protectedGate1:
mov si,String
call cmdprint
cld
cli
in al,0x92
or al,2
out 0x92,al
lgdt[gdt32Ptr]
lidt[IdtPipe]
mov eax, cr0
or eax,1
mov cr0, eax
; mov [saved_segment],ds
jmp code32_post:__protected_mode_32
%include 'file_system.inc'
TaskA:
cmp cx,0
jz protectedGate1
call Filer
jmp protectedGate1
;section .data
file db "text.txt",0
;section .bss
;test values
;referencer resb 4
;buffer resb 1024
;referencer db 4
;buffer db 1024
;buffer db 100
;len equ 1024
len equ 100
;
;
;section .text
global Filer
Filer:
mov eax,5
mov ebx,file
mov ecx,0
int 80h
mov [referencer],eax
; read presets
mov eax,3
mov ebx,[referencer]
mov ecx,buffer ;read to buffer
mov edx,len ;
int 80h ;read len db to buffer
mov edx,eax ;puts data counted
; write presets
mov eax,4 ;write preset
mov ebx,1 ;to primary stream
mov ecx,buffer ;from primary buffer
int 80h ;reserve all read scanned data from buffer
mov eax,6 ;close file preset
mov ebx,[referencer] ;
int 80h ;
mov eax,1
mov ebx,0
int 80h
ret
int data1 = 12 _ int data2 = 23 _
; ReTimerOS
; Copyright (C) 2022,2023 Christopher Hoy
;
; This file is part of ReTimerOS
; ReTimerOS is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program. If not, see <https://www.gnu.org/licenses/>.
;%define REBASE_ADDRESS(A) (0x7E00 + ((A) - protectedGate1))
%define BUILD_GDT_DESC(bounds,base,access,flags) \
((( base & 0x00FFFFFF) << 16) | \
(( base & 0xFF000000) << 32) | \
( bounds & 0x0000FFFF) | \
(( bounds & 0x000F0000) << 32) | \
(( access & 0xFF) << 40) | \
(( flags & 0x0F) << 52))
;[ORG 0x7E00]
[BITS 16]
;section .text
; prep area
Ref_Task1: dw 0
;protectedGate1:
;qqqqqqqqqqqq
;preset code
;task segment preset
mov word [Ref_Task1],cx
;cmp word [Ref_Task1],0
;cmp cx,0
;jz short protectedGate1
cmp cx,0x8b76
jz TaskA
;jmp TaskA
;qqqqqqqqqqqqq
protectedGate1:
mov si,String
call cmdprint
cld
cli
in al,0x92
or al,2
out 0x92,al
lgdt[gdt32Ptr]
lidt[IdtPipe]
mov eax, cr0
or eax,1
mov cr0, eax
; mov [saved_segment],ds
jmp code32_post:__protected_mode_32
%include 'file_system.inc'
TaskA:
cmp cx,0
jz protectedGate1
call Filer
jmp protectedGate1
cmdprint:
cld
mov ah,0x0E
cmdstring:
lodsb
int 0x10
cmp al,0
jnz cmdstring
ret
;section .text
[bits 32]
; 32 bit protected mode
__protected_mode_32:use32
; mov ax, 0x10
mov ax,data32_post
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
; mov ss, ax
; restate cr3
mov cr3, ebx
; restate esp
mov esp, edx
mov cx,[gate_voucher]
cmp word [gate_voucher],0
jnz loopcheck
mov word [gate_voucher],1
jmp BIOS32_PREP
loopcheck:
hlt
jmp loopcheck
; jmp 0x8000
BIOS32_PREP:use32
; pusha
;pushf
; save current esp to edx
mov edx, esp
; jumping to 16 bit protected mode
; disable interrupts
cli
; clear cr3 by saving cr3 data in ebx register
xor ecx, ecx
mov ebx, cr3
mov cr3, ecx
jmp code16_post:__protected_mode_16
[bits 16]
; 16 bit protected mode
__protected_mode_16:use16
; jumping to 16 bit real mode
xor eax,eax
xor ecx,ecx
; mov ax, 0x38
mov cx,data16_post
; mov ax,0
mov ds, cx
mov es, cx
mov fs, cx
mov gs, cx
mov ss, cx
; turn off protected mode
; set bit 0 to 0
;tss prep
mov bp,word [Ref_Task1]
mov eax, cr0
and al, ~0x01
mov cr0, eax
; jmp 0x0:REBASE_ADDRESS(__real_mode_16)
; jmp 0x0:REBASE_ADDRESS(0x0000_9000)
jmp 0x8000
; jmp 0x9C00
; jmp 0x9e00
; jmp 0xa000
; jmp 0xc000
; jmp 0xee00
; jmp 0xf400
; jmp 0xf000
;section .data
String: db 'platform 2',10,13,0
checkString: db 'check',10,13,0
gdt32:
dq BUILD_GDT_DESC(0,0,0,0)
gdt32code:
dq BUILD_GDT_DESC(0x0000ffff,0,10011010b,1100b)
gdt32data:
dq BUILD_GDT_DESC(0x0000ffff,0,10010010b,1100b)
gdt16code:
dq BUILD_GDT_DESC(0x0000ffff,0,10011010b,1000b)
gdt16data:
dq BUILD_GDT_DESC(0x0000ffff,0,10010010b,1000b)
.stub1:
code32_post: equ gdt32code -gdt32
data32_post: equ gdt32data -gdt32
;.stub:
code16_post: equ gdt16code -gdt32
data16_post: equ gdt16data -gdt32
; tss32_post: equ gdt32tss -gdt32
gdt32Len: equ $-gdt32
gdt32Ptr: dw gdt32Len-1
dd gdt32
save_cr0 dd 0
save_cr3 dd 0
saved_segment resd 0
gate_voucher dw 0
saved_stack resw 0
IdtPipe:
dw 0x03ff
dd 0
referencer: times 4 db 4
buffer: times 100 db 1
times 512-($-$$) db 0
;%include 'gdt.inc'
push cx
pop bx
cmp cx,bx
jz TaskA
; testfp.asm
bits 64
default rel
section .text
; Since SSE don't have any 'transcendental' instructions we can use
; fp87 fsin, but the argument comes from XMM0 and the result is XMM0 as well.
; Using red zone here.
global sin_
sin_:
movsd [rsp-8],xmm0
fld qword [rsp-8]
fsin
fstp qword [rsp-8]
movsd xmm0,[rsp-8]
ret
And the test code:// test.c
#include <stdio.h>
#include <inttypes.h>
#include <math.h>
#include "cycle_counting.h"
extern double sin_( double );
int main( void )
{
double a, s1, s2;
counter_T c1, c2;
unsigned int i;
i = 0;
c1 = c2 = 0;
for ( a = 0.0; a < 2.0 * M_PI; a += M_PI / 180.0, i++ ) // dregrees to radians.
{
counter_T ctmp;
ctmp = BEGIN_TSC();
s1 = sin( a ); // glibc sin() function.
ctmp = END_TSC( ctmp );
c1 += ctmp;
ctmp = BEGIN_TSC();
s2 = sin_( a ); // our function.
ctmp = END_TSC( ctmp );
c2 += ctmp;
// this is here 'cause without this the compiler will get rid of sin() call
// since it is an 'intrinsic' and the result isn't used, otherwise.
printf( "%g, %g\n", s1, s2 );
}
c1 /= i;
c2 /= i;
printf( "glibc sin(): %" PRIu64 " cycles.\n"
"sin_(): %" PRIu64 " cycles.\n",
c1, c2 );
}
BEGIN_TSC() and END_TSC() gets the timestamp counter, serializing the processor.$ nasm -felf64 -o testfp.o testfp.asm
$ cc -O2 -ffast-math -c -o test.o test.c
$ cc -s -o test test.o testfp.o -lm
$ ./test
...
glibc sin(): 145 cycles.
sin_(): 102 cycles.
...
$ ./test
...
glibc sin(): 174 cycles.
sin_(): 210 cycles.
First case, sin_() is 29,6% faster than sin(). Second case, sin() is 17% faster than sin_().
"rep" gets its parameter from cx or ecx. np?
Best.
Frank