欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-21 21:38:56
...

一.前言

  汇编学习的过程参考了王爽老师的《汇编语言》第三版,在笔记当中会相应的书目页数,可以翻书查阅。
  本次实验的内容在《汇编语言》的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(字节型,字型,双字型)

相关标签: 初学