Порівняти реєстрацію з елементом у верхній частині стеку?

Чи можна порівняти реєстр з елементом у верхній частині стеку, не спершу висувати його?

EG таким чином, я можу це зробити, але я повинен виставити значення в першу чергу:

push 1
pop ax
cmp ax,1
jz equal

Чи можливо це зробити, не змінюючи стек?

0

6 Відповіді

Якщо ви говорите про спеціальну версію 8086 (а не про сімейство x86), то ні, я не вірю, що в режимі непрямий реєстр використовувався стековий покажчик.

Основними варіантами були:

                [BX]  [SI]
   or    or
                [BP]  [DI]

Звичайно, ви можете переносити покажчик стека на BP , якщо ви не використовували його для чогось іншого, а потім використовуєте це:

mov  bp, sp
mov  ax, [bp]
; now check ax

або якщо ви не заперечуєте, що стек змінюється протягом дуже короткого періоду часу (але будьте уважні, якщо переривання можуть спричинити проблеми, вони можуть пожежати між pop і push ):

pop  ax
push ax
; now check ax
1
додано

Якщо ви говорите про спеціальну версію 8086 (а не про сімейство x86), то ні, я не вірю, що в режимі непрямий реєстр використовувався стековий покажчик.

Основними варіантами були:

                [BX]  [SI]
   or    or
                [BP]  [DI]

Звичайно, ви можете переносити покажчик стека на BP , якщо ви не використовували його для чогось іншого, а потім використовуєте це:

mov  bp, sp
mov  ax, [bp]
; now check ax

або якщо ви не заперечуєте, що стек змінюється протягом дуже короткого періоду часу (але будьте уважні, якщо переривання можуть спричинити проблеми, вони можуть пожежати між pop і push ):

pop  ax
push ax
; now check ax
1
додано

Якщо у 32-розрядному захищеному режимі використовується сімейний процесор x86 (80386 і вище), порівняння верхньої частини стека з AX без використання PUSH або POP досить простий, оскільки всі регістри загального призначення можуть бути використані як базовий індекс.

CMP    AX, [ESP]      ; compare top of stack with AX
CMP   EAX, [ESP]      ; compare top of stack with EAX

З "Таблиці 2-1. 16-бітних форм адресації з ModR/M байтом" Довідкового посібника IA32 Instruction Set, можна використовувати наступні комбінації.

[BX] + displacment
[BP] + displacement
[SI] + displacement
[DI] + displacement
[BX + SI] + displacement
[BX + DI] + displacement
[BP + SI] + displacement
[BP + DI] + displacement

На жаль, використання реєстру стека не є одним з них у 16-розрядному режимі (наприклад, на 8086). Це означає, що для доступу до верху стек без використання PUSH чи POP, спочатку потрібно перемістити вміст реєстру SP до BX, BP, SI або DI, а потім використати один з цих регістрів для доступу до верхнього елемента на стекі .

Є пара готч, про які ви повинні знати. Ви повинні бути впевнені, що регістр сегмента за замовчуванням реєстру відповідає реєстрі сегментів сектора SS або ви повинні явно примусити використання певного регістру сегментів у регістрі. З тих пір, як я виконував будь-яке 16-розрядне кодування, було дуже давно, тому деякі з цих правил втечуть мене від моменту. Посібники обов'язково містять їх.

Регістр BP використовує сегмент стека SS за умовчанням. Він також використовується для створення структури стека всередині процедури та для індексування, щоб отримати параметри, передані в стек, а також локальні змінні стека.

PUSH    BP        ; These two lines are often used to create the stack
MOV     BP, SP    ; at the start of a routine
SUB     SP, #     ; Carve space on the stack for local stack variables

Типова кадрова стек може виглядати як ...

[BP + 6]    ; 16-bit parameter
[BP + 4]    ; 16-bit parameter
[BP + 2]    ; return address IP saved on stack
[BP + 0]    ; saved BP on stack
[BP - 2]    ; 16-bit local variable on the stack
[BP - 4]    ; 16-bit local variable on the stack

Сподіваюся, це допоможе.

0
додано

Якщо у 32-розрядному захищеному режимі використовується сімейний процесор x86 (80386 і вище), порівняння верхньої частини стека з AX без використання PUSH або POP досить простий, оскільки всі регістри загального призначення можуть бути використані як базовий індекс.

CMP    AX, [ESP]      ; compare top of stack with AX
CMP   EAX, [ESP]      ; compare top of stack with EAX

З "Таблиці 2-1. 16-бітних форм адресації з ModR/M байтом" Довідкового посібника IA32 Instruction Set, можна використовувати наступні комбінації.

[BX] + displacment
[BP] + displacement
[SI] + displacement
[DI] + displacement
[BX + SI] + displacement
[BX + DI] + displacement
[BP + SI] + displacement
[BP + DI] + displacement

На жаль, використання реєстру стека не є одним з них у 16-розрядному режимі (наприклад, на 8086). Це означає, що для доступу до верху стек без використання PUSH чи POP, спочатку потрібно перемістити вміст реєстру SP до BX, BP, SI або DI, а потім використати один з цих регістрів для доступу до верхнього елемента на стекі .

Є пара готч, про які ви повинні знати. Ви повинні бути впевнені, що регістр сегмента за замовчуванням реєстру відповідає реєстрі сегментів сектора SS або ви повинні явно примусити використання певного регістру сегментів у регістрі. З тих пір, як я виконував будь-яке 16-розрядне кодування, було дуже давно, тому деякі з цих правил втечуть мене від моменту. Посібники обов'язково містять їх.

Регістр BP використовує сегмент стека SS за умовчанням. Він також використовується для створення структури стека всередині процедури та для індексування, щоб отримати параметри, передані в стек, а також локальні змінні стека.

PUSH    BP        ; These two lines are often used to create the stack
MOV     BP, SP    ; at the start of a routine
SUB     SP, #     ; Carve space on the stack for local stack variables

Типова кадрова стек може виглядати як ...

[BP + 6]    ; 16-bit parameter
[BP + 4]    ; 16-bit parameter
[BP + 2]    ; return address IP saved on stack
[BP + 0]    ; saved BP on stack
[BP - 2]    ; 16-bit local variable on the stack
[BP - 4]    ; 16-bit local variable on the stack

Сподіваюся, це допоможе.

0
додано

На самому початку будь-якого ASM exe ви оголошуєте блок пам'яті для запису верхньої частини стека

 STAK dw[0]

і використовувати bx для зберігання верхньої частини стека, sp

 mov bx,STAK
 mov [bx],sp

Тоді використовуйте bx для порівняння з будь-яким реєстром, коли потрібно порівняти, bx - це вказівний регістр

 mov bx,[STAK]
 cmp ax,[bx]

Ви можете використовувати bp замість bx, якщо хочете

0
додано

На самому початку будь-якого ASM exe ви оголошуєте блок пам'яті для запису верхньої частини стека

 STAK dw[0]

і використовувати bx для зберігання верхньої частини стека, sp

 mov bx,STAK
 mov [bx],sp

Тоді використовуйте bx для порівняння з будь-яким реєстром, коли потрібно порівняти, bx - це вказівний регістр

 mov bx,[STAK]
 cmp ax,[bx]

Ви можете використовувати bp замість bx, якщо хочете

0
додано