Защищенный режим asm - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Имеется программка в Реальном режиме, необходимо перевести ее в защищенный. Подскажите, как это сделать? Сама программа выписывает из битовой строки , по биту длиной Len=5.
.386
sseg segment stack use16 'stack'
     dw 256 dup(?)
sseg ends
data segment use16
bitstr  db 10110011b
len     db 5
data ends
code segment use16
assume cs:code,ds:data,ss:sseg
start:  mov ax,data
    mov ds,ax
    mov si,offset bitstr
    mov cx,0
    mov cl,len
    mov bx,cx
    dec bx
m1: mov dl,'0'
    bt [si],bx
    adc dl,0    
    dec bx
    mov ah,2
    int 21h
    mov ah,4ch
    loop m1
    int 21h
code ends
end start

Решение задачи: «Защищенный режим asm»

textual
Листинг программы
    format  MZ
 
    LF  equ 10
    CR  equ 13
 
    entry   _TEXT:start
 
    segment _TEXT use16
 
start:
    push    cs
    pop ds
    mov ax, ss
    mov cx, es
    sub ax, cx
    mov bx, sp
    shr bx, 4
    inc bx
    add bx, ax          ;release unused DOS memory
    mov ah, 4Ah
    int 21h
    mov ax, 1687h       ;DPMI host installed?
    int 2Fh
    and ax, ax
    jnz nohost
 
    push    es          ;save DPMI entry address
    push    di
    and si, si          ;requires host client-specific DOS memory?
    jz  nomemneeded
    mov bx, si
    mov ah, 48h         ;alloc DOS memory
    int 21h
    jc  nomem
    mov es, ax
nomemneeded:
    mov bp, sp
    mov ax, 0001        ;start a 32-bit client
    call    far [bp]        ;initial switch to protected-mode
    jc  initfailed
;now in protected-mode
; CS = 16-bit selector corresponding to real-mode CS
; SS = selector corresponding to real-mode SS (64K limit)
; DS = selector corresponding to real-mode DS (64K limit)
; ES = selector to program's PSP (100h byte limit)
; FS = GS = 0
    mov cx,1            ;get a descriptor for the 32-bit code segment
    mov ax,0
    int 31h
    jc  dpmierr
    mov bx,ax                   ; base selector
    mov dx,_TEXT32
    mov cx,dx
    shl dx,4
    shr cx,12                   ; now CX:DX = linear(flat) _TEXT32 addr
    mov ax,7            ;set base
    int 31h
    or  dx,-1
    xor cx,cx
    mov ax,8            ;set limit
    int 31h
    mov cx,cs
    lar cx,cx
    shr cx,8
    or  ch,40h          ;make a 32bit CS
    mov ax,9
    int 31h
    push    bx          ; _TEXT32 selector
    push    start32
    retf                ;jump to 32bit CS
nohost:
    mov dx, dErr1
error:
    mov ah, 9
    int 21h
    mov ax, 4C00h
    int 21h
nomem:
    mov dx, dErr2
    jmp error
initfailed:
    mov dx, dErr3
    jmp error
dpmierr:
    mov dx, dErr4
    jmp error
 
;   segment _DATA use16
 
bitstr      db  10110011b
szWelcome   db      "Good bye, ugly 16 bit!",CR,LF
        db  "Hello, world from DOS protected mode 32-bit client!",CR,LF
        db  "bit string=$"
dErr1       db  "no DPMI host installed",CR,LF,'$'
dErr2       db  "not enough DOS memory for client initialisation",CR,LF,'$'
dErr3       db  "DPMI initialisation failed",CR,LF,'$'
dErr4       db  "no LDT descriptors available",CR,LF,'$'
dpmi1       db  'physical memory controlled by host=$'
 
;--- the 32-bit code segment
 
    segment _TEXT32 use32
 
start32:
    mov edx, szWelcome      ;print welcome message
    mov ah,9
    int 21h
LEN =   5
    mov     esi, bitstr
    mov ecx, LEN
    mov ebx, ecx
    dec ebx
@@:     xor al, al
    bt  [esi], ebx
    adc al, 30h
    int 29h
    dec ebx
    loop    @B
    mov ah,0
    int 16h
    mov ax, 4C00h       ;return to DOS
    int 21h

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.091 из 5
Похожие ответы