2022-3-7 王爽《汇编语言》实验九

一、实验八
不能正确返回,是因为中断的缘故吧。
在这里插入图片描述
看了下网上别人的分析,发现自己的想法是错误的。自己认为程序从 start -> s -> s0 -> s -> s1 然后永远不会返回。
但是 jump short s1 计算的不是相地址,而是偏移量,向前偏移 5 字节自然就到了程序入口处,也就是关于返回设置的那一块儿。

程序执行前的代码:
在这里插入图片描述
在这里插入图片描述

程序自上到下执行到 s0 时候的代码,明白自己为什么错了,第一次分析的时候,误以为 21h 会移动到 s1处,发现是用根据相对地址来计算偏移地址的,因此就返回到程序的入口处了。
在这里插入图片描述
在这里插入图片描述

二、实验九
我的源代码,是错误的。我将其作为一个简单的内存拷贝,结果发现无法拷贝到缓存区当中。猜测缓冲区是随着屏幕上显示的数字动态变化的。

ssume cs:codesg

codesg segment
start:mov al,00h
      mov ah,0b8h  
      mov ds,ax

      mov di,8
      mov si,9

      mov cx,6
      mov al,41h
      mov bx,40h
      mov ah,0cah

    s:mov [bx+di],al
      mov [bx+si],ah
      add di,2
      add si,2
      add al,1h
      loop s

      mov ax,4c00h
      int 21h
codesg ends
end start

为什么 B800 的内存改不了?是因为这个内存的内容随着字符的显示而改变吗?
在这里插入图片描述
2、下面是我从网上看的别人的文章

assume cs:code
data segment
	db 'welcome to masm!'
	db 02h,24h,71h  ; 要求的三个颜色对应的16进制代码
data ends

stack segment
	db 16 dup(0)
	; 也可以是下面的定义法:
	; dw 8 dup(0)
stack ends

code segment

start:	
		; 设置data段,以及ds:bx指向data段的第一个单元,
		; 即ds:[bx]的内容就是data段第一个单元的内容  
		mov ax,data
		mov ds,ax
		
		;设置显示缓存区段
		mov ax,0b800h ;设置起始缓存
		mov es,ax		
		
		;设置栈段
		mov ax,stack
		mov ss,ax
		mov sp,10h  ;指向栈顶
		
		;初始化三个寄存器
		mov bx,780h ; 行 从12-14行(注意:从第1行开始计数)
		//780h = 0a0h * C
		//这个是实际上的第13行
		//第十二行应该从 6E0 开始
		//每一行开头和结尾的计算方法
		//头 = 0 + 0a0h * i
		//尾 = 09fh + 0a0h*i
		(i从0开始算起)
		//题目要求在屏幕中间,屏幕能够显示 25 行
		//最中间的那一行是第13行
		
		mov si,10h ; 颜色的偏移量,三次循环每次
					; 增加 1h 指向下一个颜色
		
		mov cx,3    ; 三次循环改变行
	s: 	mov ah,ds:[si] ;颜色事先存放在ah中
		push cx		
		push si
		
		
		mov cx,16  ; 16次循环改变列
		
		mov si,64  ; 这里的si的意义是多少列,
			; 为什么从64列开始呢?
			; (1)字符串为32字节,16字节ASCLL码,16字节属性
		    ; (2)每一行有160列,那么余下有 160-32=128列为空白
			;    要使得字符串居中显示,那么字符串的左边和右边
			;  	都应该是64字节(128/2),而列数是从0开始计数,
			; 所以左边的64字节为0-63,所以这里偏移量为64
		mov di,0  
					
	s0:	mov al,ds:[di] ;将date段中的字符一个一个传入es中
		mov es:[bx+si],al ; 低位存放字符
		mov es:[bx+si+1],ah ; 高位存放颜色
		
		add si,2  ;显示缓存区字符ASCII码偏移量为2
		add di,1  ;data段字符的偏移量,每次加 1 
		
		loop s0
		
		pop si  
		pop cx  ;后进先出,先出栈si,再出栈cx
		
		add si,1h  ;指向下一个颜色
		add bx,0a0h ;指向下一行 160=0a0h
		loop s
		
		mov ax,4c00h
		int 21h
code ends

end start


最后的运行结果
在这里插入图片描述
不要逐步调试,直接一个 -g 按到底。
逐步调试最后啥也不会显示

参考文章:王爽《汇编语言》(第三版)实验9解析
参考文章:王爽汇编语言实验8:分析一个奇怪的程序

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值