有关汇编实验9.9的随笔

2022/4/26 1:42:36

本文主要是介绍有关汇编实验9.9的随笔,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  此实验对于本人来说难点有四个:1.阅读的材料很长,但是基本全是干货.2.对于各个寄存器转移的是字节还是字不够明确.3.在编程中的逻辑不够顺畅,4.汇编基本共不扎实.此实验不是我本人独立完成,看了网上鱼C的视频讲解和一些稳炸过以后完成的.

   由于时间关系我只能熟悉汇编,看得懂汇编的代码,为后面的微机原理做准备,故在这个时间段内不会对汇编进行深究。希望以后的我看到此段话语明白自己学的很不好,若工作生活中用到汇编请重新好好在学习一遍!

  1.对于材料:要求:在屏幕中央输入:“welcome to masm!”,这个字符串在屏幕中央字体和字体背景有不同的颜色。字体和字体北京称为字符串的属性,属性被记录在属性字节当                                                                                7   6   5  4  3  2  1   0

中。属性字节的格式为:                             含义:BL  R  G  B  I  R  G  B            需要哪个属性哪个属性对应的比特位就为1.如红底绿字:0100_0000B.

                                                                            闪烁  背景   高亮  前景   

 

  既然是显示,就要将其送入显存中.显存的空间为:B8000H-B8F9FH.占据整个显示屏的25行,内行有160个字节。所以通过简单的数学计算,在屏幕中间的应该是第12,13,14行,第12行中第80个字节,即为第11*160+64个字节。换算成16进制为720.所以储存位置为:0B8000h+720H=0B8720H.我们将这个当作段地址.将字符串和字符串的属性送入该段地址之后的地址即可完成题目要求.

2.想法如下:

i).需要三个寄存器一个保存字符串的字节,一个保存字符串属性的字节,一个负责接收字符串加属性(字节加字节就是一个字)。

ii)利用循环一个一个送进去

iii)完成一个以后,完成剩下两个。

3.代码如下:

assume cs:code

data segment

    db 'welcome to masm!' ;定义每个字母为一个字节

    db 02H,24H,71H          ;定义字符串的属性,这里将二进制的属性转换为16进制。如02h就是绿色

data ends

stack segment

    dw 0,0,0,0,0,0,0,0       ;定义16个字节的栈空间

stack ends

code segment

start: mov ax,data            ;无脑先把data地址数据送进ax寄存器

         mov es,ax               ;将data段地址送进段寄存器es

          mov ax,0872h         ;屏幕中间的地址

          mov ds,ax               ;将屏幕中间的地址送进段寄存器ds

          mov  si,0                 ;索引es里面的字符串数据(是字节)

          mov di,16                  ;索引es里面的字符属性数据(是字节)

          mov bx,0                 ;是ds里面的偏移地址,用来将es中的数据传递到ds中也就是B8720H段地址后面的地址当中

         mov ax,stack           ;将栈的段地址传递给寄存器ax

         mov  ss,ax               ;将stack栈的段地址传给ss

         mov  sp,16               ;指向栈底,注意我们定义的占空间是16个字节(0-15byte)又因为此时栈为空,所以sp应该出栈,指向16

         mov   cx,3               ;这里的cx是后加的,先完成的内循环,即完成第一个的“welcome to masm!”的上色和屏幕输出,然后外循环三次,在外循环中修改内循环的属性

         s:push cx                ;将cx送进栈保护起来,防止其值被内循环破坏

           mov cx,16              ;内循环16次,因为“welcome to masm!”是十六个字节

         s0: mov al, es:[si]     ;将si中的字传送给ax,因为我使用的是小段机器,在机器中welcome to masm!是按照从低到高的顺序进行储存的,所以第一次传送的是we,但是小端w                                              会被留下,大端的e会被丢弃.

             mov ah,  es:[di]     ;这里也可以直接改写成si+16.同理由于是小端机器,这里只需要一个字节,传送的字的大端会被丢弃

             mov ds:[bx],al       ;将al中的数据传递给[bx],[bx]能储存一个字,这里将al传递给bx字中的低位字节部分[bx]指向储存单元0(低位)和1(高位)

             mov  ds:[bx],ah      ;将ah中的数据传递给[bx+1],这里将ah传递给[bx+1]字中的低位字节部分,[bx+1]指向储存单元1(低位)和2(高位)

            inc si                      ;si低位指向下一个字节

            add bx,2                ;  注意这里的bx应该加2,因为bx需要指向的是下一个字

           loop s0                   ; 至此将一个完整的字符串和其一个固定的属性送进了显存之中

           pop cx                    ;赶紧把c栈中的x拿出来

           inc di                      ;di低位指向下一个字节,改变字符串的属性

           mov bx,80h           ;160-16=148,148用十六进制表示为80h送入屏幕下一行的中间

          loop  s                     ;完成三次循环

       mov 4c00h

        int 21h

    code ends

    end   start



这篇关于有关汇编实验9.9的随笔的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程