王爽汇编实验9

======================================

网上搜到的答案

======================================

实验9 根据材料编程(第175页)

-------------------------------

assume cs:code,ds:data,ss:stack

 

data segment

        db 'welcome to masm!'  ;定义要显示的字符串(共16字节)

        db 02h,24h,71h    ;定义三种颜色属性

data ends

 

stack segment

        dw 8 dup(0)

stack ends

 

code segment

start:

        mov ax,data

        mov ds,ax

        mov ax,stack

        mov ss,ax

        mov sp,10h

        mov bx,0

        mov di,0

        mov ax,0b872h    ;算出屏幕第12行中间的显存的段起始位置放入ax中

 

        mov cx,3     ;外循环为3次,因为要显示三个字符串

s3:     push cx        ;三个进栈操作为外循环s3保存相关寄存器的值

        push ax        ;以防止它们的值在内循环中被破坏

        push di

        mov es,ax      ;此时es为屏幕第12行中间的显存的段起始位置

        mov si,0

        mov di,0

 

        mov cx,10h     ;内循环为10h次,因为一个字符串中含10h个字节

s1:     mov al,ds:[bx+si]

        mov es:[bx+di],al

        inc si

        add di,2

        loop s1      ;此循环实现偶地址中存放字符

       

        mov si,1   ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备

        pop di        ;将di的值恢复成进入内循环之前的时候的值

        mov al,ds:10h[bx+di]    ;取颜色属性[源OP寻址方式:相对基址变址]

 

        mov cx,10h     ;第二个内循环也为10h次

s2:     mov es:[bx+si],al

        add si,2

        loop s2       ;此循环实现奇地址中存放字符的颜色属性

       

        ;以下4句为下一趟外循环做准备

        inc di

        pop ax

        add ax,0ah   ;将显存的段起始地址设为当前行的下一行

                  ;[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]

        pop cx

 

        loop s3

       

        mov ax,4c00h

        int 21h

 

code ends

end start


======================================

自己做的

======================================

;B8000H~BFFFFH 80x25 彩色字符显示缓冲区
;02H 黑底绿字
;01110001B 白底蓝字
;00100100B 绿底红字
;00000010B 黑底绿字
assume cs:code,ds:data
data segment
db 'welcome to masm!' ; 16个字符
data ends


code segment

  start:
  mov ax,data
mov ds,ax ;ds是存放数据
mov cl,10H
mov ch,0

mov ax,0B800h
mov es,ax ;es指向显示缓冲区

mov si,0h
mov di,0h

s: 
mov al,0
mov al,ds:[si]
 
mov ah,0 ;第一行
mov ah,00000010B
mov es:[720h+di],ax  

mov ah,11110001B ;第二行  
mov es:[720h+di+160D],ax  
 
mov ah,10100100B ;第三行  
mov es:[720h+di+320D],ax   ; 11*160+16 第12行第一个字符的位置
 
inc si
add di,02H

loop s
 
mov ax,4c00h
int 21h
code ends
end start


  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值