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
70
22-01.md
70
22-01.md
|
|
@ -55,40 +55,42 @@ are mine.
|
|||
|
||||
**LISTING 22.1 L22-1.ASM**
|
||||
|
||||
OnStack struc ;data that's stored on the stack after PUSH BP
|
||||
OldBP dw ? ;caller's BP
|
||||
RetAddr dw ? ;return address
|
||||
Filler dw ? ;character to fill the buffer with
|
||||
Attrib dw ? ;attribute to fill the buffer with
|
||||
BufSize dw ? ;number of character/attribute pairs to fill
|
||||
BufOfs dw ? ;buffer offset
|
||||
BufSeg dw ? ;buffer segment
|
||||
EndMrk db ? ;marker for the end of the stack frame
|
||||
OnStack ends
|
||||
;
|
||||
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 ax,[bp].Attrib ;load AX with attribute parameter
|
||||
and ax,0ff00h ;prepare for merging with fill char
|
||||
mov bx,[bp].Filler ;load BX with fill char
|
||||
and bx,0ffh ;prepare for merging with attribute
|
||||
or ax,bx ;combine attribute and fill char
|
||||
mov bx,[bp].BufOfs ;load DI with target buffer offset
|
||||
mov di,bx
|
||||
mov bx,[bp].BufSeg ;load ES with target buffer segment
|
||||
mov es,bx
|
||||
mov cx,[bp].BufSize ;load CX with buffer size
|
||||
rep stosw ;fill the buffer
|
||||
Bye:mov sp,bp ;restore original stack pointer
|
||||
pop bp ; and caller's BP
|
||||
ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack
|
||||
ClearS endp
|
||||
```nasm
|
||||
OnStack struc ;data that's stored on the stack after PUSH BP
|
||||
OldBP dw ? ;caller's BP
|
||||
RetAddr dw ? ;return address
|
||||
Filler dw ? ;character to fill the buffer with
|
||||
Attrib dw ? ;attribute to fill the buffer with
|
||||
BufSize dw ? ;number of character/attribute pairs to fill
|
||||
BufOfs dw ? ;buffer offset
|
||||
BufSeg dw ? ;buffer segment
|
||||
EndMrk db ? ;marker for the end of the stack frame
|
||||
OnStack ends
|
||||
;
|
||||
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 ax,[bp].Attrib ;load AX with attribute parameter
|
||||
and ax,0ff00h ;prepare for merging with fill char
|
||||
mov bx,[bp].Filler ;load BX with fill char
|
||||
and bx,0ffh ;prepare for merging with attribute
|
||||
or ax,bx ;combine attribute and fill char
|
||||
mov bx,[bp].BufOfs ;load DI with target buffer offset
|
||||
mov di,bx
|
||||
mov bx,[bp].BufSeg ;load ES with target buffer segment
|
||||
mov es,bx
|
||||
mov cx,[bp].BufSize ;load CX with buffer size
|
||||
rep stosw ;fill the buffer
|
||||
Bye:mov sp,bp ;restore original stack pointer
|
||||
pop bp ; and caller's BP
|
||||
ret EndMrk-RetAddr-2 ;return, clearing the parms from the stack
|
||||
ClearS endp
|
||||
```
|
||||
|
||||
The first thing you'll notice about Listing 22.1 is that **ClearS** uses
|
||||
a **REP STOSW** instruction. That means that we're not going to improve
|
||||
|
|
|
|||
Loading…
Reference in a new issue