69,373
社区成员
发帖
与我相关
我的任务
分享
LABEL_SEARCH_IN_ROOT_DIR_BEGIN:
; mov dx, [wRootDirSizeForLoop]
; add dx, 30h
; mov [StringBuf], dx
; call DispStr1
cmp word [wRootDirSizeForLoop], 0
LABEL_SEARCH_IN_ROOT_DIR_BEGIN:
mov ax, word [wRootDirSizeForLoop]
add ax, 0x30
mov [StringBuf], ax
call DispStr1
由于我没有把wRootDirSizeForLoop的值转换成可显示的字符串,所以这里我对这个数字加上了0x30以便能够显示出来,当然超过9的就暂不管它是否可以正常显示了。
其中的StringBuf定义如下:
StringBuf db "tempbuf "
DispStr1的函数如下:
DispStr1:
push es
mov ax, 0
mov es, ax
mov dh, [StringBuf]
sub dh, 0x30 ; 这一行会改变显示效果
mov ax, StringBuf
mov bp, ax ; ┓
mov cx, 8 ; CX = 串长度
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 0007h ; 页号为0(BH = 0) 黑底白字(BL = 07h)
mov dl, 0
int 10h ; int 10h
pop es
ret
其中注意对dh的操作,如果我不对dh附值,即dh值为0时,最终的打印如下:
打印全部集中在第一行的开始位置。
如果dh被附值,如代码所示(注意减去0x30是因为在调用函数的时候加了0x30),则打印结果如下:
这样就可以清楚 地看到值确实在一次次地减小了。
本次记录有两点:
1. 在显示之前,需要清空es的值,否则显示的内容是空
2. 如果要改变显示输出的行,改变dh的值为对应行号即可
cmp word [wRootDirSizeForLoop], 0
这一行断点停住,它就能跑出结果为NO LOADER,然后我再重新启动不用断点也会有这个结果了(有这个结果才是正常的,因为我没有把loader写入进来),晕死了,这个在两台电脑上都是一样的情况,我真糊涂了
mov word [wDigBuf], SectorNoOfRootDirectory
也能成功了,这不是在耍我吗?Bochs!
mov word [wSectorNo], SectorNoOfRootDirectory
mov word [wDigBuf], 17
结果就附值成功了:
和上面的对比的结果,结论是为什么一个变量不能同时给另外两个变量附值?
mov word [wDigBuf], SectorNoOfRootDirectory
mov word [wSectorNo], SectorNoOfRootDirectory
结果wSectorNo附值失败了:
原来是第二个附值失败,和变量没啥关系。
那这又是咋回事呢?奇怪了