70,040
社区成员
发帖
与我相关
我的任务
分享
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写入进来),晕死了,这个在两台电脑上都是一样的情况,我真糊涂了
这一语句已经把0x31送入到了AL中,但在显示的寄存器中却看不到有哪个是0x31的值
mov word [wDigBuf], SectorNoOfRootDirectory
也能成功了,这不是在耍我吗?Bochs!
mov word [wSectorNo], SectorNoOfRootDirectory
mov word [wDigBuf], 17
结果就附值成功了:
和上面的对比的结果,结论是为什么一个变量不能同时给另外两个变量附值?
mov word [wDigBuf], SectorNoOfRootDirectory
mov word [wSectorNo], SectorNoOfRootDirectory
结果wSectorNo附值失败了:
原来是第二个附值失败,和变量没啥关系。
那这又是咋回事呢?奇怪了
然后在开始的位置同wSectorNo一样附值:
结果wSectorNo附值成功,而新变量wDigBuf不成功:
这是什么情况?好奇怪
另外一个命令:

多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)