汇编程序初步,显示字符串

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

	call pause	
        
        mov ax,4c00h
        int 21h
  pause proc near  ;子程序定义(起退出缓冲作用)
	jmp short exitbegin
	exitstr db 0ah,0dh,'Press any key to exit...$'
	exitbegin:
        	push ax
        	push ds
        	push dx
        	;以上3条push指令的作用是保存现场
        	mov ax,seg pause ;取子程序名pause所在的段地址
        	mov ds,ax
        	lea dx,exitstr
        	mov ah,9  ;显示字符串exitstr的内容
        	int 21h
        	mov ah,7 ;等待输入一个[无回显]字符
        	int 21h
        	pop dx
        	pop ds
       	 	pop ax
        	;以上3条pop指令的作用是恢复现场
        	ret
   pause endp  ;子程序定义结束 

code ends
end start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值