汇编程序设计笔记(三),王爽汇编语言实验七,俩bug记录

一.前言

  汇编学习的过程参考了王爽老师的《汇编语言》第三版,在笔记当中会相应的书目页数,可以翻书查阅。
  本次实验的内容在《汇编语言》的172页实验7,实验七的核心在于寻址和除法运算,本篇是关于本实验的第二篇,主要记录一些bug
  王爽老师的书写的真是好…

二.记录

(一)使用ds:data指令没有改变ds寄存器的值


  1.很奇怪的情况:在第一行写下代码assume ds:data,ds中的值是还是初始值0760h,所以找不到数据。实际情况查看内存情况时,data segment的数据在0760:0100的位置
  2.删去assume ds:data,老老实实在code segment中输入

mov ax,data
mov ds,ax

  之后ds的值变为0770h(上面的0760:0100就是0770h)
  为啥ds:data指令没有生效???
  提醒:保险起见,对段寄存器的赋值还是放在code segment中比较安全

(二)在复制‘1975’等四个字符的字符串时,只要循环三次就够了?

  1.问题描述:data segment中的数据如下

db '1975','1976','1977','1978','1979','1980','1981','1982','1983'

  数据结构是二维数组,因为每个年份有四个字符,所以复制时按理说应当复制四次。但是如下代码实际上只需要三次

		mov cx,3	;1层循环,用来定位字符串中的字符
	s1:	push cx
		mov ax,ds:[bp][si]		;数据来源地址
		mov es:[bx].0[si],ax	;数据去向地址
		inc si
		pop cx
		loop s1					;循环三次后,四个字符复制完成

  2.分析
   首先,cx中存放的值=循环次数,这一点不能有任何怀疑
,因为循环中没影响到cx
   那么确实只循环了三次
   那么问题出在何处?思考后往下看
   
   问题在于数据的位数和寄存器的位数,数据是db字节型的,仅八位,但中转用的寄存器ax却是16位的,所以实际上我们在挪数据的时候是一次挪了两个字符。
   对于‘1975’这个字符,实际上操作时是以‘19’‘97’‘75’这样的形式往内存里放的,所以最后产生了三次循环挪四个字符的效果。正确的做法是用8位寄存器al来存放数据而非16位寄存器ax
   修改后的代码如下

	    mov al,ds:[bp][si]
		mov es:[bx][si],al

   提醒:复制数据时一定一定要先确认数据的基本类型是db,dw,还是dd(字节型,字型,双字型)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值