2

这有点像三个问题合二为一,无论如何这里是:

1-所以我一直在这里搜索我的问题的答案,有人从某处引用了这个:

堆栈段的地址大小属性决定堆栈指针大小(16、32 或 64 位)。当前代码段的操作数大小属性决定了堆栈指针的递减量(2、4 或 8 个字节)。

有人能以像我这样的汇编新手可以理解的方式向我解释吗?

2-问题是我创建了这个小堆栈:

setStack:                  ; setup a small stack at 0x9B000

  cli                      ; disable interrupts
  mov AX, 0x9000
  mov SS, AX
  mov SP, 0xB000
  sti                      ; re-enable interrupts

由于我(最肯定缺乏)对 1 处的引用的理解,我假设这个堆栈有一个 16 位指针,并且 push/pop 指令在被调用时递减/递增 2 个字节?我假设正确吗?

3-假设我已经正确假设(即:即使我没有,也像我一样回答下一个问题)下一个语句将在堆栈上执行什么?

push ECX                   ; ECX is a 32 bit register

在此先感谢 Stack Overflow 的善良居民。

4

2 回答 2

1

如果堆栈段设置为 16 位堆栈,则 push/pop 将引用 SP,并且堆栈应在两个字节边界上对齐。压入一个 16 位的寄存器会占用一个插槽,压入一个 32 位的寄存器会占用两个插槽。您可以使用以下代码自行验证这一点:

push eax
pop ax
pop bx

如果堆栈段设置为 32 位堆栈,则 push/pop 将引用 ESP,并且堆栈应在四字节边界上对齐。压入一个 32 位寄存器将占用一个插槽。压入 16 位寄存器将导致堆栈未对齐。这是一件坏事。

以下 URL 是英特尔手册中推送指令规范的副本。我已经为推送指令附加了状态机。

http://www.rz.uni-karlsruhe.de/rz/docs/VTune/reference/vc266.htm

IF StackAddrSize  32
THEN

IF OperandSize  32
THEN
ESP  ESP - 4;
SS:ESP  SRC; (* push doubleword *)
ELSE (* OperandSize  16*)
ESP  ESP - 2;
SS:ESP  SRC; (* push word *)
FI;

ELSE (* StackAddrSize  16*)

IF OperandSize  16
THEN
SP  SP - 2;
SS:SP  SRC; (* push word *)
ELSE (* OperandSize  32*)
SP  SP - 4;
SS:SP  SRC; (* push doubleword *)
FI;

FI;
于 2012-09-07T10:06:20.440 回答
0

尝试一下!(看起来你在“你自己的操作系统”中,但可能有可用的 dos 吗?)

; nasm -f bin -o test32.com test32.asm
bits 16
org 100h

mov eax, 11112222h
push eax
pop ax
pop dx
call ax2hex
mov ax, dx
call ax2hex
ret

;-------------------
ax2hex:
    push cx
    push dx

    mov cx, 4           ; four digits to show

.top
    rol ax, 4           ; rotate one digit into position
    mov dl, al          ; make a copy to process
    and dl, 0Fh         ; mask off a single (hex) digit
    cmp dl, 9           ; is it in the 'A' to 'F' range?
    jbe .dec_dig        ; no, skip it
    add dl, 7           ; adjust
.dec_dig:
    add dl, 30h         ; convert to character

    push ax
    mov ah, 2           ; print the character
    int 21h
    pop ax

    loop .top

    pop dx
    pop cx
    ret
;--------------------------

唯一重要的意见是 CPU 的意见!

最好的,弗兰克

于 2012-09-07T10:47:40.580 回答