让编程改变世界
Change the world by program
mov ax,1000h
mov ds,ax
mov al,0
mov ds:[0],al
我们以前在Debug中,为了讲解上的方便,写过类似的指令。 但这种做法是不合理的 ,因为之前我们并没有论证过 1000:0中是否存放着重要的系统数据或代码。 如果1000:0中存放着重要的系统数据或代码,“mov ds:[0],al” 将其改写,将引发错误。 比如 [codesyntax lang="asm"]assume cs:code code segment mov ax,0 mov ds,ax mov ds:[26h],ax mov ax,4c00h int 21h code ends end[/codesyntax] 可见,我们在不能确定一段内存空间中是否存放着重要的放据或代码的时候,不能随意向其中写入内容。 不要忘记,我们是在操作系统的环境中工作,操作系统管理所有的资源,也包括内存。 同样不能忘记,我们正在学习的是汇编语言,要通过它来获得底层的编程体验,理解计算机底层的基本工作机理。 所以我们尽量直接对硬件编程,而不去理会操作系统。 我们似乎面临一种选择,是在操作系统中安全、规矩地编程,还是自由、直接地用汇编语言去操作真实的硬件,了解那些早己被层层系统软件掩盖的真相? 在大部分的情况下,我们选择后者,除非我们就是在学习操作系统本身的内容。
X=0
循环12次:将ffff:X单元中的数据送入0020:X(需要用一个寄存器中转)
X=X+1
(3)在循环中,源单元ffff:X和目标单元的0020:X的偏移地址X是变量。我们用bx来存放。 (4)我们用将0:200~0:20b用0020:0~0020:b描述,就是为了使目标单元的偏移地址和源始单元的偏移地址从同一数值0开始。 程序代码 [codesyntax lang="asm"]assume cs:code code segment mov bx,0 ;(bx)=0,偏移地址从0开始 mov cx,12 ;(cx)=12,循环12次 s: mov ax,0ffffh mov ds,ax ;(ds)=0ffffh mov dl,[bx] ;(dl)=((ds)*16+(bx)),将ffff:bx中的数据送入dl mov ax,0020h mov ds,ax ;(ds)=0020h mov [bx],dl ;((ds)*16+(bx))=(dl),将dl的数据送入0020:bx inc bx ;(bx)=(bx)+1 loop s mov ax,4c00h int 21h code ends end[/codesyntax]
assume cs:code code segment mov ax,0ffffh mov ds,ax ;(ds)=0ffffh mov ax,0020h mov es,ax ;(es)=0020h mov bx,0 ;(bx)=0,此时ds:bx指向ffff:0,es:bx指向0020:0 mov cx,12 ;(cx)=12,循环12次 s: mov dl,[bx] ;(dl)=((ds)*16+(bx)),将ffff:bx中的数据送入dl mov es:[bx],dl ;((es)*16+(bx))=(dl),将dl的数据送入0020:bx inc bx ;(bx)=(bx)+1 loop s mov ax,4c00h int 21h code ends end[/codesyntax] [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LGWLWROJURDG']视频下载[/Downlink]