Защищенный режим 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д