Значение нажимных регистров с сегментом и смещением - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу создать MBR на ассемблере.Но у меня есть код, выданный кем-то, кого я не понимаю.Когда вы пишете

push ax
push bx

Что означает, когда мы используем сегмент и смещение

Для получения более подробной информации прочитайте этот код:

    [BITS 16]
[ORG 0x0]

mov ax, 0x07C0
mov ds , ax
mov es , ax
mov ax , 0x8000
mov ss , ax
mov sp , 0xf000

mov si ,msgDebut
call afficher

end :
    jmp end

msgDebut db "HelloWorld!!!!",13,10,0

afficher :
    push ax
    push bx

.debut :
    lodsb
    cmp al ,0
    jz .fin
    mov ah , 0x0E
    mov bx , 0x07
    int 0x10
    jmp .debut

.fin :
    pop bx
    pop ax
    ret

times 510-($-$$) db 144
    dw 0xAA55

Можете ли вы объяснить мнеэтот код построчно с использованием адресации памяти, сегментации и абстракции смещения

1 Ответ

0 голосов
/ 22 февраля 2019

Инструкция push помещает свой операнд в стек для сохранения.
Стек - это область памяти, выделенная для этой цели.

Указатель стека определяет , где данные будут храниться в памяти.Когда указатель стека SS:SP равен 0x8000: 0xEFFE, push ax сначала уменьшит указатель стека на 2, чтобы он стал 0x8000: 0xEFFC, а затем запишет содержимое регистра AX в этот адрес памяти.
Здесь и далее push bx снова опустит указатель стека на 2, так что теперь он становится 0x8000: 0xEFFA, а затем записывает содержимое регистра BX в этот адрес памяти.

Инструкция pop отменяет действия push,Вы используете их, чтобы восстановить регистры до их первоначальных значений.

afficher :
    push ax   ; Preserve AX
    push bx   ; Preserve BX
    ...
    pop bx    ; Restore BX
    pop ax    ; Restore AX
    ret
...