Loading... <!-- wp:audio {"id":169} --> <figure class="wp-block-audio"><audio controls src="https://www.cjovi.icu/usr/uploads/2020/10/01-I-Dont-Want-to-Miss-a-Thing-From-_Armageddon_-Soundtrack.m4a"></audio><figcaption><span class="has-inline-color has-luminous-vivid-amber-color"><em><span class="external-link"><a class="no-external-link" href="https://music.163.com/#/song?id=20506296&market=baiduqk" target="_blank"><i data-feather="external-link"></i>I Don't Want to Miss a Thing (From Armageddon Soundtrack)</a></span></em></span></figcaption></figure> <!-- /wp:audio --> <!-- wp:paragraph --> <p>今天的进度还是比较令人满意的</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>实验7</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>今天主要的时间都花在这上面了,就这么几个寄存器卡来卡去,幸运的是最后还是达成了目的。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>代码之类的在另一篇博客中<strong><span class="external-link"><a class="no-external-link" href="https://www.cjovi.icu/asm-learn/%E7%8E%8B%E7%88%BD-%E6%B1%87%E7%BC%96%E8%AF%AD%E8%A8%80-%E7%AC%AC%E5%9B%9B%E7%89%88-%E5%AE%9E%E9%AA%8C7.html" target="_blank"><i data-feather="external-link"></i><span class="has-inline-color has-luminous-vivid-orange-color">王爽《汇编语言》(第四版) 实验7</span></a></span></strong>。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":4} --> <h4><span class="has-inline-color has-luminous-vivid-amber-color">BP</span></h4> <!-- /wp:heading --> <!-- wp:paragraph --> <p>没什么新意,一个以ss为默认段寄存器的寻址寄存器。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>第七章主要是<strong>转移指令的原理</strong>和几种转移指令</p> <!-- /wp:paragraph --> <!-- wp:separator --> <hr class="wp-block-separator"/> <!-- /wp:separator --> <!-- wp:heading {"level":3} --> <h3>转移指令</h3> <!-- /wp:heading --> <!-- wp:heading {"level":5} --> <h5><span class="has-inline-color has-light-green-cyan-color">offset</span></h5> <!-- /wp:heading --> <!-- wp:paragraph --> <p>获取标号地址</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>... start: .... mov ax,offset start ...</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>以上代码执行后,ax的值就是start标号的地址。配合jmp即可实现跳至任意标号。</p> <!-- /wp:paragraph --> <!-- wp:separator --> <hr class="wp-block-separator"/> <!-- /wp:separator --> <!-- wp:heading {"level":5} --> <h5><span class="has-inline-color has-pale-pink-color">jmp</span></h5> <!-- /wp:heading --> <!-- wp:paragraph --> <p>jmp指令的细节莫名的多,分为短地址转移<code>jmp short s</code>,近地址转移<code>jmp near ptr s</code>,远地址转移<code>jmp far s</code>,寄存器转移(我编的名字)<code>jmp reg</code> (reg是16位寄存器)。段内转移<code>jmp word ptr</code>,段间转移<code>jmp dword ptr</code>。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><code>jmp short s</code> 和 <code>jmp near ptr s</code> 比较类似,都是段内的转移,转移到标号s,不同的是短地址转移的位移范围是-128~127(由此可见这是8位的),而段间近转移范围则是-65536~65535(16位)。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><code>jmp far s</code>则可实现段间远转移CS被赋为标号s所在段段地址,IP被赋为标号s所在的偏移地址</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>以上三种转移,转移是IP和CS的改变都被编译器提前计算完成并以机器码形式储存。因此我认为三种转移本质相同,不过是储存改变的变量位数不同,所能达到的转移上限不同罢了。同时,jmp是地址的相对操作,即通过对ip的加减完成,这种方式使得程序被分配到任何内存时都可以正常运行</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>寄存器转移,没什么可说的,跳至寄存器所存的地址</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><code>jmp word ptr</code>和<code>jmp dword ptr</code>,前者在段内转移,转移至ptr所指内存位置中的值,后者段间转移,此双字的高位字中的值被赋给CS,地位字赋给IP,完成转移。</p> <!-- /wp:paragraph --> <!-- wp:separator --> <hr class="wp-block-separator"/> <!-- /wp:separator --> <!-- wp:heading {"level":3} --> <h3>jcxz</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>这个名字真的是很奇怪了,全称为<span class="has-inline-color has-pale-cyan-blue-color">Jmp if CX equal to Zero</span>。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>有其全称,其作用也不难理解</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>jcxz s ... s: ...</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>以上代码和C</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>if(cx==0) then goto s; ... s: ...</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>等价(C的goto语法可能有问题,因为我没怎么用过,大概意思在就行了)</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>loop指令等价于</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>s: ... cx--; if(cx!=0) jmp short s</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>没什么意思</p> <!-- /wp:paragraph --> <!-- wp:separator --> <hr class="wp-block-separator"/> <!-- /wp:separator --> <!-- wp:heading {"level":3} --> <h3>实验8 一个奇怪的程序</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>这个实验很有意思</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>assume cs:codesg codesg segment mov ax,4c00h int 21h start: mov ax,0 s: nop nop mov di,offset s mov si,offset s2 mov ax,cs:[si] mov cs:[di],ax s0: jmp short s s1: mov ax,0 int 21h mov ax,0 s2: jmp short s1 nop codesg ends end start</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>当jmp被复制到nop时,仍然是以相对指令工作(ip-=8),所以正好可以正常返回。如果在s2前面加一条语句程序就会出错,jmp是段内转移,此时ip会被减到负数,然后就会访问到不知何处,所以这样写是危险的,没什么意义,但是作为实验加深理解还是不错的。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>实验九</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>太棒了,我终于可以输出字符了。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>assume cs:code,ds:data data segment db 'welcome to masm!' db 00000010b,10100100b,00000001b data ends code segment start: mov ax,data mov ds,ax mov ax,0b800h mov es,ax mov bx,0 mov cx,2000 sclear: mov word ptr es:[bx],0 add bx,2 loop sclear mov ax,0b878h mov es,ax s: mov bx,0 mov cx,16 mov di,0 s0: mov al,[bx] mov es:64[di],al mov es:224[di],al mov es:384[di],al mov al,ds:[10h] mov es:65[di],al mov al,ds:[11h] mov es:225[di],al mov al,ds:[12h] mov es:385[di],al inc bx add di,2 loop s0 jmp short s mov ax,4c00h int 21h code ends end start</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>这个实验介绍了8086显存的存储原理,整理如下</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>每一行可显示80个字符,屏幕总共有25行,因此整个屏幕可以显示2000个字符,每个字符用两个字节来表示,低位字节代表字符的ASCII码值,高位字节代表字符的属性值</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>属性字节格式:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> 7 6 5 4 3 2 1 0 含义 BL R G B I R G B 闪烁 背景色 高亮 前景色</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p><span class="has-inline-color has-vivid-cyan-blue-color">蓝底底不闪烁蓝字</span>:10010001b</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>显存区域为B8000H~BFFFFH共32KB,总共有八个缓冲页面,每页4KB。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>B8000:0000~B8000:009F对应第零缓冲页的第一行。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>这样就可以操作显示屏了</p> <!-- /wp:paragraph --> 最后修改:2021 年 01 月 11 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 如果觉得我的文章对你有用,那听听上面我喜欢的歌吧