[023][x86汇编语言]习题12-1:修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响)

学习笔记

《x86汇编语言:从实模式到保护模式》
https://www.jianshu.com/p/d481cb547e9f

习题12-1:修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响)。

  • 要求:对内存的读写按双字的长度进行,并在检测的同时显示已检测的内存数量。建议对每个双字单元用两个花码0x55AA55AA0xAA55AA55进行检测。
  • 分析:指定一块连续的内存区域,以双字为单元,写入0x55AA55AA再读出并与0x55AA55AA比较,看是否相等;如果相等则,再写入0xAA55AA55再再读出并与0xAA55AA55比较,看是否相等;两次都相等,说明通过检测;

代码功能

  • 双字为单元,利用两个花码反复写入读出来检测内存;
  • 在屏幕上显示 已经通过检测的单元个数 / 需要检测的单元总数 (两个数值均以十六进制显示)
  • 每通过一次检测,屏幕上的字符 感叹号! 闪烁一次;
  • 指定的内存区域全部检测通过后,在屏幕上显示字符串 "OK"

运行测试

习题12-1:修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响)
习题12-1:修改本章代码清单,使之可以检测1MB以上的内存空间(从地址0x0010_0000开始,不考虑高速缓存的影响

完整源码

    ;代码清单12-1
    ;文件名:ex12-1.asm
    ;文件说明:硬盘主引导扇区代码
    ;创建日期:16:23 2018/5/30

;---------------------------------------------------------------    
;定义常量
;---------------------------------------------------------------    
    MEMORY_START equ 0x100000           ;要检测的内存起始地址
    MEMORY_END   equ 0x500000           ;要检测的内存结束地址
    MEMORY_SIZE  equ (MEMORY_END-MEMORY_START)/4    ;以双字位单元
;---------------------------------------------------------------    
    
    ;设置堆栈段和栈指针
    mov eax,cs
    mov ss,eax
    mov sp,0x7c00
    
    ;计算GDT所在的逻辑段地址
    mov eax,[cs:pdgt+0x7c00+0x02]   ;GDT的32位线性基地址
    xor edx,edx
    mov ebx,16
    div ebx                         ;分解成16位逻辑地址
    
    mov ds,eax          ;令DS指向该段以进行操作:EAX低16位有效 DS=0x7e00
    mov ebx,edx         ;段内起始偏移地址:EDX EBX低16位有效 ebx=0x0000
    
    ;创建0#描述符,它是空描述符,这是处理器的要求
    mov dword [ebx+0x00],0x00000000
    mov dword [ebx+0x04],0x00000000
    
    ;创建1#描述符,这是一个数据段,对应0~4GB的线性地址空间
    mov dword [ebx+0x08],0x0000ffff     ;段基地址0x00000000
    mov dword [ebx+0x0c],0x00cf9200
    
    ;创建2#描述符,这是一个只执行的代码段
    mov dword [ebx+0x10],0x7c0001ff     ;段基地址0x00007C00
    mov dword [ebx+0x14],0x00409800
    
    ;创建3#描述符,这是上面代码段的别名
    mov dword [ebx+0x18],0x7c0001ff     ;段基地址0x00007C00
    mov dword [ebx+0x1c],0x00409200
    
    ;创建4#描述符,这是栈段
    mov dword [ebx+0x20],0x7c00fffe     ;段基地址0x00007C00
    mov dword [ebx+0x24],0x00cf9600
    
    ;初始化描述符寄存器GDTR
    mov word [cs:pdgt+0x7c00],39        ;5*8-1=39
    lgdt [cs:pdgt+0x7c00]
    
    in al,0x92                          ;南桥芯片的端口
    or al,0000_0010B
    out 0x92,al                         ;打开A20
    
    cli
    
    mov eax,cr0
    or eax,1
    mov cr0,eax                         ;设置PE位
    
    ;以下进入保护模式... ...
    jmp dword 0x0010:flush
    
    [bits 32]
flush:
    mov eax,0x0018      ;索引号3#
    mov ds,eax      
    
    mov eax,0x0008      ;索引号1#
    mov es,eax
    mov fs,eax
    mov gs,eax
    
    mov eax,0x0020      ;索引号4#
    mov ss,eax
    xor esp,esp         ;ESP=0
    
    mov dword [es:0x0b8000],0x072e0750  ;'P.'
    mov dword [es:0x0b8004],0x072e074d  ;'M.'
    mov dword [es:0x0b8008],0x07200720  ;'  '
    mov dword [es:0x0b800c],0x076b076f  ;'ok'

    
;---------------------------------------------------------------    
;显示需要检测的总的单元个数
;---------------------------------------------------------------        
    mov byte [es:0x0b8140],'H'
    mov byte [es:0x0b8142],'E'
    mov byte [es:0x0b8144],'X'
    mov byte [es:0x0b8146],':'
    
    mov ebp,0x0b8140+10
    mov ecx,0
    call check
    
    mov byte [es:0x0b8140+30],'/'
    
    mov ebp,0x0b8140+34
    mov ecx,MEMORY_SIZE
    call check
;---------------------------------------------------------------        
;内存检测
;以双字为单元,使用花码0x55aa55aa和0xaa55aa55进行内存检测
;---------------------------------------------------------------        
        
        xor ecx,ecx                 ;检测的单元个数
        mov ebx,MEMORY_START        ;检测的起始地址
exam:   
        mov dword [es:ebx],0x55aa55aa
        cmp dword [es:ebx],0x55aa55aa
        jnz err
        
        mov dword [es:ebx],0xaa55aa55
        mov dword [es:ebx],0xaa55aa55
        jnz err

        add ebx,4
        inc ecx
        mov byte  [es:0x0b80a0+28],'!'
        not byte  [es:0x0b80a0+29]
        
        
        mov ebp,0x0b8140+10
        call check
        
        cmp ebx,MEMORY_END
        jnz exam
        
        mov dword [es:0x0b80b0+20],0x076b076f       ;'ok'
        
;---------------------------------------------------------------        
err:
        hlt                         ;进入停机状态

        
;---------------------------------------------------------------
;子程序:check
;参数:    
;       ecx = 要显示的数值
;       ebp = 数值在显存的起始位置
;功能:    计算并显示检测的内存个数(以双字位单位)
;---------------------------------------------------------------
check:          push ebx
                push ecx
                push esi
                push eax
                push ebp
                
                mov eax,ecx
                xor ebx,ebx
                mov ecx,8
                mov esi,16
        digit:  
                xor edx,edx
                div esi
                mov [mem+ebx],dl
                inc ebx
                loop digit
                
                
                xor edi,edi
                xor ebx,ebx
                mov esi,7
        show:   
                mov al,[mem+esi]
                mov bl,al
                mov al,[number+ebx]
                mov [es:ebp+edi],al
                add edi,2
                dec esi
                jns show
        
                pop ebp
                pop eax
                pop esi
                pop ecx
                pop ebx
        
ret
;---------------------------------------------------------------
    mem     db  0,0,0,0,0,0,0,0     ;存放数位
    number  db '0123456789ABCDEF'
;---------------------------------------------------------------
    pdgt    dw  0
            dd  0x00007e00          ;GDT的物理地址
;---------------------------------------------------------------
    times 510-($-$$) db 0
                     db 0x55,0xaa

代码说明

  • 加载描述符部分以及进入保护模式与配书代码c12_mbr.asm 完全一致

https://www.jianshu.com/p/7447a004fe7f

  • 增加常量
;---------------------------------------------------------------    
;定义常量
;---------------------------------------------------------------    
    MEMORY_START equ 0x100000           ;要检测的内存起始地址
    MEMORY_END   equ 0x500000           ;要检测的内存结束地址
    MEMORY_SIZE  equ (MEMORY_END-MEMORY_START)/4    ;以双字位单元
;---------------------------------------------------------------    

  • 增加数据表,mem表存放数位,从number表中取出每个数位对应的ASCII码
    mem     db  0,0,0,0,0,0,0,0     ;存放数位
    number  db '0123456789ABCDEF'

解题参考

  • CSDN的这位博主还实现了一个很漂亮的进度条,提供的答案很棒!

https://blog.csdn.net/longintchar/article/details/50878960

  • 代码整个结构(各个部分在内存中的映象)参考

https://www.jianshu.com/p/7447a004fe7f

  • 子程序check的实现修改自书上第六章的显示各个数位

https://www.jianshu.com/p/f71416ec68ac

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容