i'm translating the chapter 8.5(from K&R2) _fillbuf in assembly for
windows (because that routine has many calls in the code (although i
thought it was better in C) ). This is the first time, i have compiled
it not run it. Is there some advise? Is it for you still assembly?
I use here the window API ReadFile
pf point an objet of this kind
thank you
typedef struct _iobuf{
int cnt;
char* ptr;
char* base;
unsigned flag;
int fd;
} FILE_m;
/* int _fillbuf_m(FILE_m* pf)
/* nota per essere chiamata D[pf+cnt]<0
/* s=0r, 4j, 8i, 12r, 16c, 20ra, 24P_fp
__fillbuf_m:
< c, r, i, j, r
<< READ=1, UNBUF=4, EOF=8, ERR=16, LAST=64, BUFSIZ=1024
<< @[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
i=@[EMAIL PROTECTED]
i==0#.e2; #.c0;
..e0: D[i+@[EMAIL PROTECTED]
|=EOF;
..e1: D[i+@[EMAIL PROTECTED]
] = 0;
..e2: a=-1; ##.cf;
..c0: a=[i+@[EMAIL PROTECTED]
a&= _ READ||EOF||ERR _; a!=READ#.e2;
a=[i+@[EMAIL PROTECTED]
a&LAST#.e0;
/* per file aggiornati ci vuole clearerr?
j=1; a&UNBUF#.c1; j=BUFSIZ;
..c1: a=[i+@[EMAIL PROTECTED]
a==0!#.c2;
a=j; a<<=1; a+=2; _malloc_m<(a); a==0#.e2;
a+=j; [i+@[EMAIL PROTECTED]
[i+@[EMAIL PROTECTED]
r=@[EMAIL PROTECTED]
c=s; ReadFile(r, a, j, c, 0);
a==0!#.c4 | D[i+@[EMAIL PROTECTED]
|=ERR; ##.e1;
..c3: ##.e0;
..c4: *s!=j !#.c5| D[i+@[EMAIL PROTECTED]
|=LAST
..c5: --D[i+@[EMAIL PROTECTED]
!<?#.c6 | D[i+@[EMAIL PROTECTED]
##.e1;
/* __iobStream_m==stdin, "sta" e "val_now" sono dword per
/* permettere input mode senza echo all'esterno
..c6: i==__iobStream_m!#.c7 | D*sta=0; D*val_now#.c7; D*sta=1;
..c7: r=[i+@[EMAIL PROTECTED]
a^=a; al=*r; ++D[i+@[EMAIL PROTECTED]
>> READ, UNBUF, EOF, ERR, LAST, BUFSIZ
>> @[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
@[EMAIL PROTECTED]
> c, r, i, j, r
ret
; int _fillbuf_m(FILE_m* pf)
; nota per essere chiamata D[pf+cnt]<0
; s=0r, 4j, 8i, 12r, 16c, 20ra, 24P_fp
__fillbuf_m:
push ecx
push edx
push esi
push edi
push edx
%define READ 1
%define UNBUF 4
%define EOF 8
%define ERR 16
%define LAST 64
%define BUFSIZ 1024
%define @[EMAIL PROTECTED]
[esp+24]
%define @[EMAIL PROTECTED]
0
%define @[EMAIL PROTECTED]
4
%define @[EMAIL PROTECTED]
8
%define @[EMAIL PROTECTED]
12
%define @[EMAIL PROTECTED]
16
mov esi, @[EMAIL PROTECTED]
cmp esi, 0
je .e2
jmp short .c0
..e0:
or dword[esi+@[EMAIL PROTECTED]
EOF
..e1:
mov dword[esi+@[EMAIL PROTECTED]
], 0
..e2:
mov eax, -1
jmp .cf
..c0:
mov eax, [esi+@[EMAIL PROTECTED]
and eax, READ|EOF|ERR
cmp eax, READ
jne .e2
mov eax, [esi+@[EMAIL PROTECTED]
; per file aggiornati ci vuole
clearerr?
test eax, LAST
jnz .e0
mov edi, 1
test eax, UNBUF
jnz .c1
mov edi, BUFSIZ
..c1:
mov eax, [esi+@[EMAIL PROTECTED]
cmp eax, 0
jne .c2
mov eax, edi
shl eax, 1
add eax, 2
push eax
call _malloc_m
add esp, 4
cmp eax, 0
je .e2
add eax, edi
mov [esi+@[EMAIL PROTECTED]
eax
..c2:
mov [esi+@[EMAIL PROTECTED]
eax
mov edx, @[EMAIL PROTECTED]
mov ecx, esp
push 0
push ecx
push edi
push eax
push edx
call ReadFile
cmp eax, 0
jne .c4
or dword[esi+@[EMAIL PROTECTED]
ERR
jmp .e1
..c3:
jmp .e0
..c4:
cmp [esp], edi
je .c5
or dword[esi+@[EMAIL PROTECTED]
LAST
..c5:
dec dword[esi+@[EMAIL PROTECTED]
jge .c6
cmp dword[esi+@[EMAIL PROTECTED]
-1
je .c3
jmp .e1
; __iobStream_m==stdin, "sta" e "val_now" sono dword per
; permettere input mode senza echo all'esterno
..c6:
cmp esi, __iobStream_m
jne .c7
mov dword[sta], 0
cmp dword[val_now], 0
jne .c7
mov dword[sta], 1
..c7:
mov edx, [esi+@[EMAIL PROTECTED]
xor eax, eax
mov al, [edx]
inc dword[esi+@[EMAIL PROTECTED]
..cf:
%undef READ
%undef UNBUF
%undef EOF
%undef ERR
%undef LAST
%undef BUFSIZ
%undef @[EMAIL PROTECTED]
%undef @[EMAIL PROTECTED]
%undef @[EMAIL PROTECTED]
%undef @[EMAIL PROTECTED]
%undef @[EMAIL PROTECTED]
%undef @[EMAIL PROTECTED]
pop edx
pop edi
pop esi
pop edx
pop ecx
ret


|