于渊《orange's 一个操作系统实现》的字符串输出函数disp_str有bug会导致异常

2023-05-16

于渊先生的《orange’s 一个操作系统实现》的字符串输出函数disp_str有bug会导致异常

发现在同一个函数中两次使用disp_str就会导致异常,这个问题困扰了我很久,一般来说都是堆栈的没有恢复好的问题,在反复的检查后发现堆栈并没有什么问题,disp_str是一个汇编程序,莫名觉得是符号问题,鬼使神差的使用c程序对其包装发现没有这样的问题,一直往堆栈方向想,但后来想到自己大一写汇编函数的时候都会小心翼翼的把每个涉及到的寄存器进行保护,想到这里,可能有一些使用到的寄存器没有保护到,导致出现bug了,于是乎将该函数涉及到的寄存器都做了一遍保存,在函数返回的时候进行恢复,总算是解决了。

写汇编函数的时候一定要注意对会使用到的寄存器的恢复,很难清楚调用函数的c被编译后有没有使用到这些寄存器。

; ========================================================================
;          void disp_str(char * info);
; ========================================================================
disp_str:
    push    ebp
    push    esi
    push    edi
    push    eax
    push    ebx
    mov ebp, esp

    mov esi, [ebp + 24] ; pszInfo
    mov edi, [disp_pos]
    mov ah, 0Fh
.1:
    lodsb
    test    al, al
    jz  .2
    cmp al, 0Ah ; 是回车吗?
    jnz .3
    push    eax
    mov eax, edi
    mov bl, 160
    div bl
    and eax, 0FFh
    inc eax
    mov bl, 160
    mul bl
    mov edi, eax
    pop eax
    jmp .1
.3:
    mov [gs:edi], ax
    add edi, 2
    jmp .1

.2:
    mov [disp_pos], edi
    pop ebx
    pop eax
    pop edi
    pop esi
    pop ebp
    ret 4

在经过更改之后,基本上没问题了,但是为了不浪费调用栈,在ret后还加了一个4,因为一开始调用这个函数的时候会把一个4字节的字符串指针压栈,但是加了这个4之后就出了问题了,所以4是不能加的,可能是nasm自动优化了,用别的方式把栈推掉了?而我这么做多余导致出错?总之最后的打印函数如下

; ========================================================================
;          void disp_str(char * info);
; ========================================================================
disp_str:
    push    ebp
    push    esi
    push    edi
    push    eax
    push    ebx
    mov ebp, esp

    mov esi, [ebp + 24] ; pszInfo
    mov edi, [disp_pos]
    mov ah, 0Fh
.1:
    lodsb
    test    al, al
    jz  .2
    cmp al, 0Ah ; 是回车吗?
    jnz .3
    push    eax
    mov eax, edi
    mov bl, 160
    div bl
    and eax, 0FFh
    inc eax
    mov bl, 160
    mul bl
    mov edi, eax
    pop eax
    jmp .1
.3:
    mov [gs:edi], ax
    add edi, 2
    jmp .1

.2:
    mov [disp_pos], edi
    pop ebx
    pop eax
    pop edi
    pop esi
    pop ebp
    ret 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

于渊《orange's 一个操作系统实现》的字符串输出函数disp_str有bug会导致异常 的相关文章

随机推荐

  • 嵌入式系统之-小米路由器3G v1

    嵌入式系统之 小米路由器3G v1 相关汇总 xff1a 嵌入式系统系列目录 第一篇 嵌入式系统之 小米路由器3G V1 第二篇 未完待续 xff0c 欢迎收藏关注 目录 嵌入式系统之 小米路由器3G v1前言一 开箱和拆机二 硬件配置三
  • 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO 异步IO 阻塞IO 非阻塞IO xff0c 这几个词常见于各种各样的与网络相关的文章之中 xff0c 往往不同上下文中它们的意思是不一样的 xff0c 以致于我在很长一段时间对此感到困惑 xff0c 所以想写一篇文章整
  • Google Dapper-大规模分布式系统的基础跟踪设施

    说明 xff1a 本文是阅读Google论文 Dapper a Large Scale Distributed Systems Tracing Infrastructure 之后的一个简要总结 xff0c 完整译文可参考此处 另论文 Unc
  • 分布式会话跟踪系统架构设计与实践

    本文整理自美团点评技术沙龙第08期 xff1a 大规模集群的服务治理设计与实践 美团点评技术沙龙由美团点评技术团队主办 xff0c 每月一期 每期沙龙邀请美团点评及其它互联网公司的技术专家分享来自一线的实践经验 xff0c 覆盖各主要技术领
  • 学术工具-Citavi 简介

    因为之前也有过看了文献的经历 xff0c 每次都要打印出来 xff0c 然后再纸上写笔记等等 xff0c 可能回头了还找不到关键记号等问题 xff0c 决心有工具就好好利用起来 现在也刚好有机会 xff0c 在知乎上看到了一位现大一大神做的
  • Qt5.7.0 mingw+qwtplot3D 编译

    一 基本编译问题 在安装的过程中却遇到了很多的问题 咨询了Google中大量的帖子 xff0c 发现按照他们说的方法根本没法解决我的实际问题 研究了整整宝几天 xff0c 总算是编译通过 xff0c 解决了所有的问题 下面将通过重现我的安装
  • 一篇实用的Latex的入门教程

    转载 LaTeX新人教程 xff0c 一小时从完全陌生到基本入门 作者 董楠 LaTeX新人教程 xff0c 一小时从完全陌生到基本入门 by Nan 对于真心渴望迅速上手LaTeX的人 xff0c 可以只看正文 曾经在缝缝补补中变得长长的
  • Qt5.8.0使用QChart的问题

    Qt Charts 的横空出世标识着 QWT QCustomPlot 时代的终结 xff0c 是时候向他们做一个简单的告别了 Qt Charts 强大并极具吸引力 xff0c 从现在开始 xff0c 让我们顺势拥抱灿烂的明天 引自 xff1
  • 成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)

    一 家庭服务器实现的主要功能 1 流媒体播放服务 xff1a 利用DLNA实现电视 手机 电脑播放其上面的媒体文件 2 文件共享 xff1a 利用samba实现手机 电脑等终端与服务器的文件共享 3 自动下载 xff1a 利用aria2c实
  • 架构漫谈(八):从架构的角度看如何写好代码 + 我的思考

    我的总结 xff1a 当先前对于利益相关者的关系理清了 xff0c 系统基本架构和测试方法等也有了 xff0c 进入实际Coding阶段 在Coding前 xff0c 需要我们考虑好业务功能的分配 xff0c 关注于功能会频繁变更的部分 x
  • 插头类型:MX 1.25 PH间距2.0、XH间距2.5/2.54、VH间距3.96区别?

    PH xff0c XH xff0c ZH等这些都是JST xff08 Japan Standard Time 日本压着端子制造株式会社 xff09 的料号 xff0c 因为JST用的最多 xff0c 且很多工厂都在模仿制作 xff0c 故也
  • 树莓派NAS搭建——基于OMV

    之前树莓派的debian版系统里装了个以samba服务为基础的NAS xff0c 但在实际使用中发现写入速度只有2M s xff0c 特别慢 xff0c 用的是Class 10的高速TF卡也于事无补 实在无法直视 xff0c 于是一直在搜寻
  • 最短路径算法——Dijkstra介绍

    个人心得体会 xff1a 理解这种或这类算法 xff0c 可以先从小规模的问题入手 xff0c 并逐渐推广到问题变复杂的情况 xff0c 这样理解起来也可以更方便和透彻 和数学归纳法很相似 图简介 以使用地图APP为例 xff0c 假设你想
  • net framework4.0未能成功安装、另一个安装操作正在进行、请继续这个操作之前完成那个操作。

    转自百度 安装net framework 4 0出错的解决方法 步骤 xff1a 开始 运行 xff08 输入CMD xff09 确定或者回车 xff0c 打开管理员命令窗口 xff1b 在管理员命令窗口输入 xff1a net stop
  • java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver

    第一次写jsp xff0c 用jdbc连接数据库进行查询的时候 xff0c Class forName 34 com microsoft jdbc sqlserver SQLServerDriver 34 newInstance conn
  • numpy Array [: ,] 的取值方法

    numpy Array 的取值方法 NumPy数组是一个多维数组对象 xff0c 称为ndarray 创建一个numpy数组 如下所示 span class token keyword import span numpy span clas
  • 如何安装windows和linux双系统

    最近装了两天系统积攒了一下经验 原本一直使用win7 xff0c 现需要使用linux操作系统作为开发环境 xff0c 虚拟机的能力总是有限 xff0c 所以打算装双系统 xff0c 装系统以前一直对我来说一直很神秘 xff0c 为什么系统
  • sed -i命令详解

    sed i命令详解 root 64 www sed nefr 动作 选项与参数 xff1a n xff1a 使用安静 silent 模式 在一般 sed 的用法中 xff0c 所有来自 STDIN 的数据一般都会被列出到终端上 但如果加上
  • 模拟信号和数字信号的区别

    作者 xff1a 杨眀 链接 xff1a https www zhihu com question 38377832 answer 118464689 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业
  • 于渊《orange's 一个操作系统实现》的字符串输出函数disp_str有bug会导致异常

    于渊先生的 orange s 一个操作系统实现 的字符串输出函数disp str有bug会导致异常 发现在同一个函数中两次使用disp str就会导致异常 xff0c 这个问题困扰了我很久 xff0c 一般来说都是堆栈的没有恢复好的问题 x