直接访问堆栈
Access stack directly
此问题与nasm Intel: Access items in the stack without using pop
相关
我的数据、代码和堆栈段是为了覆盖整个内存而设置的。
我尝试使用以下代码直接访问堆栈:
[bits 32]
[org 0x0]
mov ah, 0x62
mov al, 'H'
push ax
mov esi, 0x90000 ;(esp is 0x90000)
sub esi, 4
mov word ax, [esi]
mov word [0xB8A00], ax
jmp $
它应该打印一个 H,但它什么也没打印。我不明白我做错了什么,我也尝试删除 sub esi, 4,结果相同。我也试过切换ah & al内容(因为小端我保留了这个顺序)
mov esi, 0x90000 ;(esp is 0x90000)
这是您代码中令人担忧的部分。尽管你说“esp 是 0x90000”,但防御型程序员会把它写成 mov esi, esp
。这样做可以避免 知道太多 .
的问题
将字符代码和属性字节放入堆栈的代码将使堆栈指针指向这对字节。无论您使用 push ax
还是 push eax
.
,这都是正确的
假设您可以线性访问内存,确保 DS
等于 SS
,并且屏幕设置正确 (*),下一个片段将放置 GreenOnBrown 大写字母“H " 屏幕第十七行第一列:
mov ah, 0x62
mov al, 'H'
push ax
mov esi, esp
mov ax, [esi]
mov [0xB8A00], ax
作为替代方案,使用 ESP
相对寻址:
mov ah, 0x62
mov al, 'H'
push ax
mov ax, [esp]
mov [0xB8A00], ax
(*) 经常问自己显存中的地址是否在其内容被硬件用来更新屏幕的地址中!
- 对于 80x25 文本屏幕,硬件可能从您期望的显示页面 0 以外的显示页面更新。
- 对于 40x25 文本屏幕,地址 0xB8A00 位于显示缓冲区之外。
此问题与nasm Intel: Access items in the stack without using pop
相关我的数据、代码和堆栈段是为了覆盖整个内存而设置的。
我尝试使用以下代码直接访问堆栈:
[bits 32]
[org 0x0]
mov ah, 0x62
mov al, 'H'
push ax
mov esi, 0x90000 ;(esp is 0x90000)
sub esi, 4
mov word ax, [esi]
mov word [0xB8A00], ax
jmp $
它应该打印一个 H,但它什么也没打印。我不明白我做错了什么,我也尝试删除 sub esi, 4,结果相同。我也试过切换ah & al内容(因为小端我保留了这个顺序)
mov esi, 0x90000 ;(esp is 0x90000)
这是您代码中令人担忧的部分。尽管你说“esp 是 0x90000”,但防御型程序员会把它写成 mov esi, esp
。这样做可以避免 知道太多 .
将字符代码和属性字节放入堆栈的代码将使堆栈指针指向这对字节。无论您使用 push ax
还是 push eax
.
假设您可以线性访问内存,确保 DS
等于 SS
,并且屏幕设置正确 (*),下一个片段将放置 GreenOnBrown 大写字母“H " 屏幕第十七行第一列:
mov ah, 0x62
mov al, 'H'
push ax
mov esi, esp
mov ax, [esi]
mov [0xB8A00], ax
作为替代方案,使用 ESP
相对寻址:
mov ah, 0x62
mov al, 'H'
push ax
mov ax, [esp]
mov [0xB8A00], ax
(*) 经常问自己显存中的地址是否在其内容被硬件用来更新屏幕的地址中!
- 对于 80x25 文本屏幕,硬件可能从您期望的显示页面 0 以外的显示页面更新。
- 对于 40x25 文本屏幕,地址 0xB8A00 位于显示缓冲区之外。