8:00 添加了SSD4实验报告内容。
2:00pm-2:52 英语准备PPT,写稿,单独练习。
2:52- 汇编实验+作业。
3:00 实验5 编写、调试具有多个段的程序
程序如下:(使用edit编辑)编译连接之后,开始debug:-u输出这种奇怪的东西,我不太理解为什么。
-d一下:emm看来CS:IP指向的的确是我的程序,只不过不是正常的代码。我一步一步运行一下,看看到代码段会不会正确。
运行几步之后就报错了。我看一下之前的程序
并不是像这次这样的。这是什么问题?可能是文件格式?
看了一下问题,发现之前我直接写的debug ex5_1,运行的;这样就直接运行了一个没有后缀的文件,而不是编译链接生成的ex5_1.exe。问题解决了。
3:57 我在想,为什么我已经有堆栈段了,在连接的时候还是有warning: no stack segment呢?
4:15 如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为网上和我使用的答案是:(N/16+1)*16 [说明:N/16只取整数部分],我认为是错的。因为应该是向上取整的;自己写了一个(N/16+N%16?0;1)*16 其实就是ceil(N/16) *16。我想的是正确的。因为举例是一个堆栈段占16个字节,另一个占4个字节,但是堆栈段和数据段相差就是1H。问题解决了。
11:49 有一个错误,程序在执行一段代码之后变成非预期的内容。
assume cs:code
a segment
db 1, 2, 3, 4, 5, 6, 7, 8
a ends
b segment
db 1, 2, 3, 4, 5, 6, 7, 8
b ends
c segment
db 0, 0, 0, 0, 0, 0, 0, 0
c ends
code segment
start: mov ax, a
mov es, ax
mov ax, c
mov ds, ax
mov bx, 0
mov cx, 8
s1:mov ax, es:[bx]
mov [bx], ax
inc bx
loop s1
mov ax, b
mov es, ax
mov bx, 0
mov cx, 8
s2:add ax, es:[bx]
mov [bx], ax
add bx, 1
loop s2
mov ax, 4c00h
int 21h
code ends
end start
发现问题是这样的:不应该直接add ax, es:[bx],而是mov ax, es[bx]然后
加到[bx]中。
改正后这个问题解决了,但是除了第一个DS:[0]其他的都是三倍。经过-t逐步debug找到问题:直接mov ax, es:[bx]得到的ax是一个字型的,即0102,0203等。所以除了01本身其它都是加了两次。参考答案中,每次bx是+2。我认为,一个0-255的数字只能占一个字节,因此每次都只需要加一即可;但答案的+2也没有问题,让我有些困扰。