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
104
22-03.md
104
22-03.md
|
|
@ -12,23 +12,25 @@ pages: 419-420
|
|||
|
||||
**LISTING 22.5 L22-5.ASM**
|
||||
|
||||
ClearS proc near
|
||||
push bp ;save caller's BP
|
||||
mov bp,sp ;point to stack frame
|
||||
cmp word ptr [bp].BufSeg,0 ;skip the fill if a null
|
||||
jne Start ; pointer is passed
|
||||
cmp word ptr [bp].BufOfs,0
|
||||
je Bye
|
||||
Start: cld ;make STOSW count up
|
||||
mov ah,byte ptr [bp].Attrib[1];load AH with attribute
|
||||
mov al,byte ptr [bp].Filler ;load AL with fill char
|
||||
les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer segment:offset
|
||||
mov cx,[bp].BufSize ;load CX with buffer size
|
||||
rep stosw ;fill the buffer
|
||||
Bye:
|
||||
pop bp ;restore caller's BP
|
||||
ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack
|
||||
ClearS endp
|
||||
```nasm
|
||||
ClearS proc near
|
||||
push bp ;save caller's BP
|
||||
mov bp,sp ;point to stack frame
|
||||
cmp word ptr [bp].BufSeg,0 ;skip the fill if a null
|
||||
jne Start ; pointer is passed
|
||||
cmp word ptr [bp].BufOfs,0
|
||||
je Bye
|
||||
Start: cld ;make STOSW count up
|
||||
mov ah,byte ptr [bp].Attrib[1];load AH with attribute
|
||||
mov al,byte ptr [bp].Filler ;load AL with fill char
|
||||
les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer segment:offset
|
||||
mov cx,[bp].BufSize ;load CX with buffer size
|
||||
rep stosw ;fill the buffer
|
||||
Bye:
|
||||
pop bp ;restore caller's BP
|
||||
ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack
|
||||
ClearS endp
|
||||
```
|
||||
|
||||
(We could get rid of yet another instruction by having the calling code
|
||||
pack both the attribute and the fill value into the same word, but
|
||||
|
|
@ -44,22 +46,24 @@ shown in Listing 22.6.
|
|||
|
||||
**LISTING 22.6 L22-6.ASM**
|
||||
|
||||
ClearS proc near
|
||||
push bp ;save caller's BP
|
||||
mov bp,sp ;point to stack frame
|
||||
les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer;segment:offset
|
||||
mov ax,es ;put segment where we can test it
|
||||
or ax,di ;is it a null pointer?
|
||||
je Bye ;yes, so we're done
|
||||
Start: cld ;make STOSW count up
|
||||
mov ah,byte ptr [bp].Attrib[1];load AH with attribute
|
||||
mov al,byte ptr [bp].Filler ;load AL with fill char
|
||||
mov cx,[bp].BufSize ;load CX with buffer size
|
||||
rep stosw ;fill the buffer
|
||||
Bye:
|
||||
pop bp ;restore caller's BP
|
||||
ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack
|
||||
ClearS endp
|
||||
```nasm
|
||||
ClearS proc near
|
||||
push bp ;save caller's BP
|
||||
mov bp,sp ;point to stack frame
|
||||
les di,dword ptr [bp].BufOfs ;load ES:DI with target buffer;segment:offset
|
||||
mov ax,es ;put segment where we can test it
|
||||
or ax,di ;is it a null pointer?
|
||||
je Bye ;yes, so we're done
|
||||
Start: cld ;make STOSW count up
|
||||
mov ah,byte ptr [bp].Attrib[1];load AH with attribute
|
||||
mov al,byte ptr [bp].Filler ;load AL with fill char
|
||||
mov cx,[bp].BufSize ;load CX with buffer size
|
||||
rep stosw ;fill the buffer
|
||||
Bye:
|
||||
pop bp ;restore caller's BP
|
||||
ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack
|
||||
ClearS endp
|
||||
```
|
||||
|
||||
Well. Now we're down to 28 bytes, having reduced the size of this
|
||||
subroutine by nearly 50 percent. Only 13 instructions remain.
|
||||
|
|
@ -103,22 +107,24 @@ With that problem dealt with, Listing 22.7 shows the Zenned version of
|
|||
|
||||
**LISTING 22.7 L22-7.ASM**
|
||||
|
||||
ClearS procnear
|
||||
pop dx ;get the return address
|
||||
pop ax ;put fill char into AL
|
||||
pop bx ;get the attribute
|
||||
mov ah,bh ;put attribute into AH
|
||||
pop cx ;get the buffer size
|
||||
pop di ;get the offset of the buffer origin
|
||||
pop es ;get the segment of the buffer origin
|
||||
mov bx,es ;put the segment where we can test it
|
||||
or bx,di ;null pointer?
|
||||
je Bye ;yes, so we're done
|
||||
cld ;make STOSW count up
|
||||
rep stosw ;do the string store
|
||||
Bye:
|
||||
jmp dx ;return to the calling code
|
||||
ClearS endp
|
||||
```nasm
|
||||
ClearS procnear
|
||||
pop dx ;get the return address
|
||||
pop ax ;put fill char into AL
|
||||
pop bx ;get the attribute
|
||||
mov ah,bh ;put attribute into AH
|
||||
pop cx ;get the buffer size
|
||||
pop di ;get the offset of the buffer origin
|
||||
pop es ;get the segment of the buffer origin
|
||||
mov bx,es ;put the segment where we can test it
|
||||
or bx,di ;null pointer?
|
||||
je Bye ;yes, so we're done
|
||||
cld ;make STOSW count up
|
||||
rep stosw ;do the string store
|
||||
Bye:
|
||||
jmp dx ;return to the calling code
|
||||
ClearS endp
|
||||
```
|
||||
|
||||
At long last, we're down to the bare metal. This version of **ClearS**
|
||||
is just 19 bytes long. That's just 37 percent as long as the original
|
||||
|
|
|
|||
Loading…
Reference in a new issue