Use backtick code blocks for syntax highlighting
This commit is contained in:
parent
8ed9dea394
commit
f658bfbb40
203 changed files with 26546 additions and 25801 deletions
210
16-07.md
210
16-07.md
|
|
@ -12,110 +12,112 @@ pages: 313-316
|
|||
|
||||
**Listing 16.6 OPT2.ASM**
|
||||
|
||||
;
|
||||
; Opt2 Final optimization word count
|
||||
; Written by Michael Abrash
|
||||
; Modified by Willem Clements
|
||||
; C/ Moncayo 5, Laurel de la Reina
|
||||
; 18140 La Zubia
|
||||
; Granada, Spain
|
||||
; Tel 34-58-890398
|
||||
; Fax 34-58-224102
|
||||
;
|
||||
parms struc
|
||||
dw 2 dup(?)
|
||||
buffer dw ?
|
||||
bufferlength dw ?
|
||||
charflag dw ?
|
||||
wordcount dw ?
|
||||
parms ends
|
||||
.model small
|
||||
.data
|
||||
charstatustable label byte
|
||||
rept 2
|
||||
db 39 dup(0)
|
||||
db 1
|
||||
db 8 dup(0)
|
||||
db 10 dup(1)
|
||||
db 7 dup(0)
|
||||
db 26 dup(1)
|
||||
db 6 dup(0)
|
||||
db 26 dup(1)
|
||||
db 5 dup(0)
|
||||
endm
|
||||
.code
|
||||
public _ScanBuffer
|
||||
_ScanBuffer proc near
|
||||
push bp
|
||||
mov bp,sp
|
||||
push si
|
||||
push di
|
||||
mov si,[bp+buffer]
|
||||
mov bx,[bp+charflag]
|
||||
mov al,[bx]
|
||||
mov cx,[bp+bufferlength]
|
||||
mov bx,offset charstatustable
|
||||
xor di,di ; set wordcount to zero
|
||||
shr cx,1 ; change count to wordcount
|
||||
jc oddentry ; odd number of bytes to process
|
||||
cmp al,01h ; check if last one is char
|
||||
jne scanloop4 ; if not so, search for char
|
||||
jmp scanloop1 ; if so, search for zero
|
||||
oddentry: xchg al,ah ; last one in ah
|
||||
lodsb ; get first byte
|
||||
inc cx
|
||||
cmp ah,01h ; check if last one was char
|
||||
jne scanloop5 ; if not so, search for char
|
||||
jmp scanloop2 ; if so, search for zero
|
||||
;
|
||||
; locate the end of a word
|
||||
scanloop1: lodsw ; get two chars
|
||||
xlat ; translate first
|
||||
xchg al,ah ; first in ah
|
||||
scanloop2: xlat ; translate second
|
||||
dec cx ; count down
|
||||
jz done1 ; no more bytes left
|
||||
cmp ax,0101h ; check if two chars
|
||||
je scanloop1 ; go for next two bytes
|
||||
inc di ; increase wordcount
|
||||
cmp al,01h ; check if new word started
|
||||
je scanloop1 ; locate end of word
|
||||
;
|
||||
; locate the begin of a word
|
||||
scanloop4: lodsw ; get two chars
|
||||
xlat ; translate first
|
||||
xchg al,ah ; first in ah
|
||||
scanloop5: xlat ; translate second
|
||||
dec cx ; count down
|
||||
jz done2 ; no more bytes left
|
||||
cmp ax,0 ; check if word started
|
||||
je scanloop4 ; if not, locate begin
|
||||
cmp al,01h ; check one-letter word
|
||||
je scanloop1 ; if not, locate end of word
|
||||
inc di ; increase wordcount
|
||||
jmp scanloop4 ; locate begin of next word
|
||||
done1: cmp ax,0101h ; check if end-of-word
|
||||
je done ; if not, we have finished
|
||||
inc di ; increase wordcount
|
||||
jmp done
|
||||
done2: cmp ax,0100h ; check for one-letter word
|
||||
jne done ; if not, we have finished
|
||||
inc di ; increase wordcount
|
||||
done: mov si,[bp+charflag]
|
||||
mov [si],al
|
||||
mov bx,[bp+wordcount]
|
||||
mov ax,[bx]
|
||||
mov dx,[bx+2]
|
||||
add di,ax
|
||||
adc dx,0
|
||||
mov [bx],di
|
||||
mov [bx+2],dx
|
||||
pop di
|
||||
pop si
|
||||
pop bp
|
||||
ret
|
||||
_ScanBuffer endp
|
||||
end
|
||||
```nasm
|
||||
;
|
||||
; Opt2 Final optimization word count
|
||||
; Written by Michael Abrash
|
||||
; Modified by Willem Clements
|
||||
; C/ Moncayo 5, Laurel de la Reina
|
||||
; 18140 La Zubia
|
||||
; Granada, Spain
|
||||
; Tel 34-58-890398
|
||||
; Fax 34-58-224102
|
||||
;
|
||||
parms struc
|
||||
dw 2 dup(?)
|
||||
buffer dw ?
|
||||
bufferlength dw ?
|
||||
charflag dw ?
|
||||
wordcount dw ?
|
||||
parms ends
|
||||
.model small
|
||||
.data
|
||||
charstatustable label byte
|
||||
rept 2
|
||||
db 39 dup(0)
|
||||
db 1
|
||||
db 8 dup(0)
|
||||
db 10 dup(1)
|
||||
db 7 dup(0)
|
||||
db 26 dup(1)
|
||||
db 6 dup(0)
|
||||
db 26 dup(1)
|
||||
db 5 dup(0)
|
||||
endm
|
||||
.code
|
||||
public _ScanBuffer
|
||||
_ScanBuffer proc near
|
||||
push bp
|
||||
mov bp,sp
|
||||
push si
|
||||
push di
|
||||
mov si,[bp+buffer]
|
||||
mov bx,[bp+charflag]
|
||||
mov al,[bx]
|
||||
mov cx,[bp+bufferlength]
|
||||
mov bx,offset charstatustable
|
||||
xor di,di ; set wordcount to zero
|
||||
shr cx,1 ; change count to wordcount
|
||||
jc oddentry ; odd number of bytes to process
|
||||
cmp al,01h ; check if last one is char
|
||||
jne scanloop4 ; if not so, search for char
|
||||
jmp scanloop1 ; if so, search for zero
|
||||
oddentry: xchg al,ah ; last one in ah
|
||||
lodsb ; get first byte
|
||||
inc cx
|
||||
cmp ah,01h ; check if last one was char
|
||||
jne scanloop5 ; if not so, search for char
|
||||
jmp scanloop2 ; if so, search for zero
|
||||
;
|
||||
; locate the end of a word
|
||||
scanloop1: lodsw ; get two chars
|
||||
xlat ; translate first
|
||||
xchg al,ah ; first in ah
|
||||
scanloop2: xlat ; translate second
|
||||
dec cx ; count down
|
||||
jz done1 ; no more bytes left
|
||||
cmp ax,0101h ; check if two chars
|
||||
je scanloop1 ; go for next two bytes
|
||||
inc di ; increase wordcount
|
||||
cmp al,01h ; check if new word started
|
||||
je scanloop1 ; locate end of word
|
||||
;
|
||||
; locate the begin of a word
|
||||
scanloop4: lodsw ; get two chars
|
||||
xlat ; translate first
|
||||
xchg al,ah ; first in ah
|
||||
scanloop5: xlat ; translate second
|
||||
dec cx ; count down
|
||||
jz done2 ; no more bytes left
|
||||
cmp ax,0 ; check if word started
|
||||
je scanloop4 ; if not, locate begin
|
||||
cmp al,01h ; check one-letter word
|
||||
je scanloop1 ; if not, locate end of word
|
||||
inc di ; increase wordcount
|
||||
jmp scanloop4 ; locate begin of next word
|
||||
done1: cmp ax,0101h ; check if end-of-word
|
||||
je done ; if not, we have finished
|
||||
inc di ; increase wordcount
|
||||
jmp done
|
||||
done2: cmp ax,0100h ; check for one-letter word
|
||||
jne done ; if not, we have finished
|
||||
inc di ; increase wordcount
|
||||
done: mov si,[bp+charflag]
|
||||
mov [si],al
|
||||
mov bx,[bp+wordcount]
|
||||
mov ax,[bx]
|
||||
mov dx,[bx+2]
|
||||
add di,ax
|
||||
adc dx,0
|
||||
mov [bx],di
|
||||
mov [bx+2],dx
|
||||
pop di
|
||||
pop si
|
||||
pop bp
|
||||
ret
|
||||
_ScanBuffer endp
|
||||
end
|
||||
```
|
||||
|
||||
### Level 2: A New Perspective {#Heading11}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue