Chinaunix首页 | 论坛 | 博客
  • 博客访问: 186597
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 418
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-26 22:37
文章存档

2015年(4)

2014年(27)

2013年(9)

我的朋友

分类: WINDOWS

2014-01-17 22:31:24

        最近阅读王爽《汇编语言》第二版,实验9是第一个可以在屏幕上看到输入输出的程序,所以我决定小试牛刀,一是检验学习成果,二是巩固所学知识,最最重要一点,看到屏幕上的输出,小自恋一把,增强成就感
        首先要确定的就是编程的大概想法。总体来说,
        1.要定义一个字符串“welcome to masm!”,很明显就想到要用到数据段,也就是ds寄存器,配套的偏移寄存器选择bx;
        2.要将字符串拷贝到显存的地址范围内,而且此时ds寄存器已经被用,所以需要另外一个段寄存器,此处选择es寄存器,配套偏移寄存器选择si;
        3.因为要将字符串输出到屏幕中间,所以需要计算屏幕中间的内存位置。显存为0xb8000h-0xbffffh处,所以显存的开始地址为0xb8000h,由于是80*25的显示缓冲区,所以中间位置就是80*13。同时要输出三行,所以第一行开始位置的坐标就是80*12。那么总共需要跳过的显示单元为80 * 11 + ((80 - 16 )/ 2)(16是字符串长度) = 912。根据书中提示,一个显示字符在显示缓冲区中占两个位置,那么要跳过962个字符就需要跳过912 * 2 = 1824个字符,换算成16进制即为720h。由此确定开始位置为0xb8720h。所以段寄存器es的值为0xb872h。
        这一切都准备好了之后,开始编程。代码如下:

点击(此处)折叠或打开

  1. assume cs:codesg,ds:datasg

  2. datasg segment
  3.     db 'welcom to masm!'
  4. datasg ends

  5. codesg segment
  6. start:
  7.     ;move data address to ds register
  8.     mov ax, datasg
  9.     mov ds, ax
  10.     
  11.     ;display area is 0xb8000h - 0xbffffh, move data to this area
  12.     mov ax, 0b872h ;with hex, must a 0 before b800h
  13.     mov es, ax
  14.     mov si, 0
  15.     mov bx, 0
  16.     mov cx, 16
  17. s:
  18.     mov al, ds:[bx]
  19.     mov es:[si], al
  20.     mov es:[si + 160], al ; newline
  21.     mov es:[si + 320], al ; newline
  22.     mov al, 02h;green property:00000010 = 2
  23.     mov es:[si + 1], al
  24.     mov al, 24h;backgroud green, word red, 00100100 = 36 = 24h
  25.     mov es:[si + 161], al
  26.     mov al, 71h;background white, word green, 01110001 = 71h
  27.     mov es:[si + 321], al
  28.     add bx, 1
  29.     add si, 2
  30.     loop s
  31.     
  32.     mov ax,4c00h
  33.     int 21h
  34. codesg ends
  35. end start
        废话不多说,编译连接运行,先看效果图,如下:
        
        在屏幕中间成功显示出了“welcome to masm!”字符串。一股自豪感油然而生
        ps:在最开始的时候,没有想要计算到屏幕中间,准备第一步先在显示缓冲区的开始地址把字符串打印出来再说,结果只能显示后两行,而第一行却无论如何也显示不出来。郁闷。后来调整到屏幕中间,三行才完整的显示出来。
        
阅读(7763) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~