首页 > 其他分享 >关于expand down

关于expand down

时间:2024-05-09 18:45:07浏览次数:26  
标签:00 mov pop down 关于 push ax bx expand

今天研究执行流,代码运行到自定义的栈时bochs总是重启。把栈的地址定义到了第三个数据段0x18,在0x7e00处,分出64k(0x10000)空间。段描述符是这样的: 

Base4 G D/B L A  + L2.5 P DLP S + T E W A   Base3   Base2  Base1  L2  L1  
  0 0 0 0    0000 1 0 0  1     0  1 1 0           二进制
00  0               0   9                6 00 7e 00 ff ff 十六进制
00 00 96 00 7e 00 ff ff 结果

加载运行后,出错。单步调试,都是在压栈的时候bochs里面的虚拟系统重启,仔细研究了一下段描述符,感觉expand down自己理解的可能不对。只管把E位改为0,即段描述符改为expand up,0x000092007e00ffff排除错误。

网上搜索解释,下面是Intel 白皮书原文。

For expand-down data segments, the segment limit has the same function but is interpreted differently. Here, the effective limit specifies the last address that is not allowed to be accessed within the segment; the range of valid offset is from (Effective-limit + 1) to FFFFFFFFH if the B is set and from (effective-limit + 1) to FFFFH is the B is clear; An expand-down segment has maximum size when the segment limit is 0.

最后一句看懂了,limit 为 0时,expand-down段有最大值。感觉理解了老外的想法,expand-up是:limit就是可用的地址范围,expand-down是:limit取反才是可用的范围。

根据这个理解不改E位,把limit全部改为0,实现成功。

放个示例记录一下。

示例代码
 [org 0x7c00]
[section .text]
[bits 16]
global _start
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    mov esp, 0x1000

xchg bx, bx

mov ax, complate - _start
;mov dl, 0x08
;div dl
;inc ax
mov cx, ax
mov si, _start
mov di, 0x500
cpymem:
    mov ax, [si]
    mov word [di], ax
    add si, 2
    add di, 2
loop cpymem

xchg bx, bx
    call _16bProgTest1
    call _16bProgTest2

xchg bx, bx
cli
    lgdt [gdtptr]

    mov dx, 0x92
    in  al, dx
    or  al, 2
    out dx, al

    mov eax, cr0
    or  eax, 1
    mov cr0, eax

sti
    jmp 8:0
_16bProgTest1:
    push bp
    mov  bp, sp
    sub  sp, 0x10

    push bx
    push si
    push di

    mov  ax, 0xAA

    pop  di
    pop  si
    pop  bx

    mov sp, bp
    pop bp
ret

_16bProgTest2:
    push bp
    mov  bp, sp
    sub  sp, 0x10

    push bx
    push si
    push di

    mov  ax, 0xBB

    pop  di
    pop  si
    pop  bx

    mov sp, bp
    pop bp
ret

gdt:
    dq 0
    dq 0x_00_40_9e_00_05_00_76_ff
    dq 0x_00_40_96_00_7e_00_00_00
    dq 0x_00_00_92_00_7e_00_ff_ff
gend:

glen equ gend - gdt

gdtptr:
    dw glen
    dd gdt


[section .text]
[bits 32]
jmp _start
_start:
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax

    mov ax, 0x10
    mov ss, ax
    mov esp, 0x2000

xchg bx, bx
    call _32bExecStream1
    call _32bExecStream2

    jmp end
_32bExecStream1:
    push ebp
    mov  ebp, esp
    sub  esp, 0x10

    push ebx
    push esi
    push edi

    mov  eax, 0xAAAA

    pop  edi
    pop  esi
    pop  ebx

    mov esp, ebp
    pop ebp
ret
 _32bExecStream2:
    push ebp
    mov  ebp, esp
    sub  esp, 0x10

    push ebx
    push esi
    push edi

    mov  eax, 0xBBBB

    pop  edi
    pop  esi
    pop  ebx

    mov esp, ebp
    pop ebp
ret

end:
    hlt
complate:


times 510-($-$$) db 0
db 0x55, 0xaa

 

标签:00,mov,pop,down,关于,push,ax,bx,expand
From: https://www.cnblogs.com/erhy/p/18182911

相关文章

  • 【java】Java之关于基本数据类型和引用数据类型的存放位置
    1、基本数据类型存放在哪?基本类型的变量存在栈里或者堆里不是由"大小可知,生存期可知"就能确定了。关键是上下文。比如:123voidmethod(){    inta=3;}这自然是存在栈里的。局部方法嘛。而:123classTest{    inta=3;}......
  • 关于浏览器插件的初步认识
    1.浏览器插件是什么,如何安装?它是浏览器允许添加额外功能或修改其行为的软件组件。这些拓展通常由第三方开发者创建,并通过浏览器的拓展系统进行安装和管理。不同浏览器有不同的拓展系统,例如:Chrome拓展:Chrome使用ChromeWebStore来分发和管理拓展。用户可以通过访问Chro......
  • MakeDown操作指南
    大标题大标题在标题下方列‘========’即可中标题中标题在标题下方列‘--------’即可小标题小标题在标题前加‘#’即可注意!!!下面所有语法的提示我都先用小标题提醒了!!!单行文本框这是一个单行的文本框,只要两个Tab再输入文字即可多行文本框这是一个有多行的文本框......
  • java 多线程CountDownLatch
     CountDownLatch简介CountDownLatch 是Java中的一个同步工具类,可以用来确保一组线程等待其他线程完成各自工作后再继续执行。CountDownLatch的应用场景CountDownLatch可以被广泛应用于各种多线程协作的场景,例如:主线程等待多个子线程完成后再执行下一步操作。多个子任......
  • Markdown文件上传到博客图片处理
    Markdown文件上传到博客图片处理在本地编写Markdown文章并准备上传到博客园时,经常会遇到的一个挑战是本地图片无法直接显示,因为它们存储在本地文件系统中。为了解决这个问题,有两种常见的策略:1.第一种策略是将图片上传到图床,并在文章中直接使用图片的外部链接。这种方法的好处是......
  • 关于vue3中使用echarts设置tooltip的type为axis不显示的问题
    因为vue3中的数据对象是用的proxy监听的,要取值需要用value等方法取出来,解决方法:使用markRaw让echarts从监听对象变成普通对象!在Vue3中,markRaw是一个用于告诉Vue的响应性系统不要对某个对象进行转换或追踪其响应性的函数。当你有一个对象,并且你确定你不需要它成为响应性......
  • 关于Java Chassis 3的契约优先(API First)开发
    本文分享自华为云社区《JavaChassis3技术解密:契约优先(APIFirst)开发》,作者:liubao68。契约优先(APIFirst)开发是指应用程序开发过程中,将API设计作为第一优先级的任务。契约优先开发随着WebServices概念的发展而不断得到重视,特别是微服务架构出现以后,API设计成为影响功能开放、......
  • markdownTest
    欢迎来到我的博客这是一篇简短的文章这里是一些介绍性的文本。Markdown非常适合写作,因为它的语法既简单又强大。主要特点易于学习:Markdown的语法非常直观。灵活性:适用于各种文档和在线发布。广泛支持:许多平台和编辑器都支持Markdown。代码示例defhello_world():pr......
  • 小组练习:请列出关于创新感受最深的几点启发在学习通提交解答的同时,可以同步发布在团队
    ]小组练习:请列出关于创新感受最深的几点启发在学习通提交解答的同时,可以同步发布在团队和个人博客上,作为学习心得体会,记录下来。我的答案:【第二组】答:1.勇于尝试与接受失败:创新意味着打破常规,尝试新的方法和思路。在这个过程中,失败是不可避免的。然而,正是这些失败,成为了我们......
  • BGP 关于实验的一些想法(暂时)
    图表1BGP综合实验 (1)AS内部IGP协议互通,双点双向重发布RR2àP5将OSPF引入到IS-IS,拒绝TAG200,打上TAG100[Huawei-isis-1]import-routeospf1inherit-costroute-policyoit 将IS-IS引入到OSPF,拒绝TAG100,打上TAG200[Huawei-ospf-1]import-routeisis1type1route......