70,020
社区成员




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时,最终的打印如下:
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附值失败了: