xiaochen 发表于 2017-9-9 20:26:58

指令mov es:[bp],al执行后es:[bp]中的值怎么和al中的不一样

本帖最后由 xiaochen 于 2017-9-9 20:50 编辑

assume cs:code
data segment
db 'welcome to masm'
data ends
code segment
start:mov ax,data
      mov ds,ax
      mov bx,0
      mov ax,0b800h
      mov es,ax
      mov bp,0
      mov al,ds:
      mov es:,al
      mov ax,4c00h
      int 21h
      code ends
      end start
指令mov es:,al执行后es:中的值怎么和al中的不一样

丶忘却的年少o 发表于 2017-9-9 20:57:39

你看这个图,我把程序改一下,让es指到一个初始化的地址,那么你的问题就解决了。你现在有想明白问题的所在吗?
答案:就是因为b800:0这个地址你没有初始化,系统是自动分配值的,就是跑飞了,什么值都可能(当然这个是夸张),所以每次你中断调试都是重新刷新了一次系统,就没了。
懂了记得点“最佳答案”{:10_303:}

丶忘却的年少o 发表于 2017-9-9 21:19:04

xiaochen 发表于 2017-9-9 21:15
我刚学到第十章 还不知道中断呢

你的是单步调试,打错了,其实中断也会产生这样的效果,只是你看不到

xiaochen 发表于 2017-9-9 21:19:39

xiaochen 发表于 2017-9-9 21:15
我刚学到第十章 还不知道中断呢

初始化就是把内存单元都变为0吗

xiaochen 发表于 2017-9-9 21:13:20

丶忘却的年少o 发表于 2017-9-9 20:57
你看这个图,我把程序改一下,让es指到一个初始化的地址,那么你的问题就解决了。你现在有想明白问题的所在 ...

怎么初始化呀

xiaochen 发表于 2017-9-9 21:15:34

xiaochen 发表于 2017-9-9 21:13
怎么初始化呀

我刚学到第十章 还不知道中断呢

3-3 发表于 2017-9-9 21:22:21

你源码中es指向了显存,那么这个es的内容就是你屏幕中对应位置所显示内容的数据,就是说,每一次你屏幕更新的时候,如果es所指向的显存中数据发生变化,那么es也会发生变化。   显存中的数据是根据屏幕更新后所在位置的内容所决定的,所以要不你就将es的位置设置的屏幕中间或者靠后,在使用cls 对屏幕进行清屏,这样由于 屏幕中es的位置没有受到影响,所以就会可以得到你想看到的效果。


在你的源码中,是在屏幕第一行第一例进显示,显然,每次屏幕刷新之后,都会更改你的数据内容,你得不到想要的数据的。

3-3 发表于 2017-9-9 21:36:15

你可以把源码调试一下,看看得到的es:中的内容是不是对应显存所在位置的ASCII值。

xiaochen 发表于 2017-9-9 21:40:36

3-3 发表于 2017-9-9 21:36
你可以把源码调试一下,看看得到的es:中的内容是不是对应显存所在位置的ASCII值。

好的 太谢谢拉 学编程的哥们都讲究

3-3 发表于 2017-9-9 21:44:02

相互学习啊,毕竟学无止境。

xiaochen 发表于 2017-9-9 21:47:39

3-3 发表于 2017-9-9 21:44
相互学习啊,毕竟学无止境。

哥们 几点睡呀 我还有个问题不明白一会儿 还想再发个问题贴 你帮我在看一下被

3-3 发表于 2017-9-9 21:53:17

好,发吧

xiaochen 发表于 2017-9-9 21:55:32

3-3 发表于 2017-9-9 21:53
好,发吧

谢拉 我先编下 马上
页: [1]
查看完整版本: 指令mov es:[bp],al执行后es:[bp]中的值怎么和al中的不一样