马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 loop 于 2011-4-16 01:54 编辑
程序6.1:编程计算以下8个数据的和,结果存在ax寄存器中,0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
程序如下:assume cs:codesg
codesg segment
dw 0123h,0456h,089h,0abch,0defh,0fedh,0cbah,0987h,
start: mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4cooh
int 21h
codesg ends
end start
以前我问过关于这个程序的问题,不过还没搞懂。。可能是我问题提得不好,不大清楚,现在我想再一次把我的疑问提出来,希望高手可以给我解答,谢谢。
首先,通过“cs:codesg”我们知道这个程序在代码段,并且,0123h,0456h,......等8个数据也在这个代码段,根据以前学过的“代码段的内存单元只能通过cs:ip指向”(不知这个知识我记得有没有错误。。。。)
程序运行时,8个数据的地址是cs:0。cs:2,cs:4,cs:6,......加之程序中的一条指令“add ax,cs:[bx]"
好的,问题来了,cs:0,或者cs:[bx]中的0,或者[bx],是指IP吗?
若是,那以前我们还学过,指令执行一条结束后,IP自动加上指令的长度并且执行下一条,那为什么还要我们编写程序“add bx,2”来人工加2?那就显然不是指IP...
若不是指IP。那cs:0,cs:[bx]中的偏移地址0和[bx]是谁指向的?他们作为数据存在代码段段地址在cs中存放我能理解。。但是这段数据的偏移地址用谁指向?
问题二:标号,就是“start:”,“s:”等,他们表示程序开始执行的入口,那是不是表明cs:IP在执行程序时就只想那里?
问题三:cs只能和IP使用吗?若是,那cs:0中的0只能是IP喽 ?那就和IP自动加上指令长度产生矛盾了。。
我可能钻进牛角尖了。。困扰我好多天百思不解。。。这阻碍我向下学习的顺畅。。。我觉得这是我学习汇编链条上的一个结,解开的话就顺畅了。。。。。
求高人! |