programming-examples/assembly/Get current Segment Values.asm

79 lines
2.6 KiB
NASM
Raw Normal View History

2019-11-15 12:59:38 +01:00
;
;
; Synopsis getseg(pcs, pds, pes, pss, psi, pdi, psp, pflag);
;
; unsigned *cs Pointer to where code segment address goes
; unsigned *ds Pointer to data segment
; unsigned *es Pointer to extra segment
; unsigned *ss Pointer to stack segment
; unsigned *si Pointer to si register
; unsigned *di Pointer to di register
; unsigned *sp Pointer to sp register
; unsigned *flag Returns flag
;
;
; Returns cs value of Code segment
; ds value of Data segment
; es value of Extra segment
; ss value of Stack segment
; si value of SI register ****NOT RELIABLE****
; di value of DI register
; sp value of Stack Pointer
; flag value of Flags register
;
;
;
pgroup group prog
prog segment byte public 'PROG' ; Combine with C 'PROG' program segment
assume cs:pgroup
public getseg
getseg proc near
push bp ; Save the frame pointer
mov bp,sp
mov si,[bp + 04] ; Get the values for the registers
mov ax,[si]
mov si,[bp + 06]
mov bx, [si]
mov si,[bp + 08]
mov cx, [si]
mov si,[bp + 10]
mov dx,[si]
;==============================================================================
mov ax, cs ;Get value of code segment
mov bx, ds ;data segment
mov cx, es ;extra segment
mov dx, ss ;stack segment
;==============================================================================
uret: mov bp,sp ; Now recover the values of the
mov si,[bp + 04] ; parameters
mov [si],ax
mov si, [bp + 06]
mov [si], bx
mov si, [bp + 08]
mov [si], cx
mov si, [bp + 10]
mov [si], dx
mov si, [bp + 12]
mov [si], si
mov si, [bp + 14]
mov [si], di
mov si, [bp + 16]
mov [si], sp
mov al, 00 ;zero out al
lahf ;load flag into ah
mov si, [bp + 18]
mov [si], ax
mov ax,0 ; No error
quit: pop bp ; Get the original frame pointer.
ret
getseg endp
prog ends
end