汇编程序设计笔记(三),王爽汇编语言实验七,俩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(字节型,字型,双字型)
下一篇: antv/l7 设置图例