甲鱼老师,还是你来吧。。他们都不会。。。
本帖最后由 loop 于 2011-4-17 04:32 编辑程序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:
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:"
好的,问题来了,cs:0,或者cs:中的0,或者,是指IP吗?
若是,那以前我们还学过,指令执行一条结束后,IP自动加上指令的长度并且执行下一条,那为什么还要我们编写程序“add bx,2”来人工加2?那就显然不是指IP...
若不是指IP。那cs:0,cs:中的偏移地址0和是谁指向的?他们作为数据存在代码段段地址在cs中存放我能理解。。但是这段数据的偏移地址用谁指向?
问题二:标号,就是“start:”,“s:”等,他们表示程序开始执行的入口,那是不是表明cs:IP在执行程序时就只指向那里?
问题三:cs只能和IP使用吗?若是,那cs:0中的0只能是IP喽 ?那就和IP自动加上指令长度产生矛盾了。。
我可能钻进牛角尖了。。困扰我好多天百思不解。。。这阻碍我向下学习的顺畅。。。我觉得这是我学习汇编链条上的一个结,解开的话就顺畅了。。。。。
谢鱼老师。。哇哇 貌似我当时也钻过这个牛角尖,但是现在木有啦,为什么呢。我回答不了你的问题。
但我就我的感觉来说下
你说之前的章节介绍过IP会自动增加,应该是第2章的CS:IP内容吧,你仔细看看,实际上还是在介绍代码的运行,一句接着一句,体现在Debug程式里,就是地址一个接一个往下,刚好当时是增加了2,因为那个MOV,AX,6622H之类的也就占个2个字节。代码自动执行,当然cs:ip ip就会变。但这个变意思就是说代码在往下执行!
而6.1例题中cs:是指 cs:bx地址处的字型数据,add ax,cs: 使用了cs:bx处的数据ax寄存器中数据相加并存放在ax寄存器。 add bx,2则是指向下一个字型数据的操作。
哎 乱七八糟的 你就将就着理解,万一还是不理解 千万可别在钻! gemen哥们你打字速度老快了呢 gemen哥们你打字速度老快了呢
小广哥 发表于 2011-4-14 14:14 http://fishc.com/dz/images/common/back.gif
你懂了没? 问题一:这里估计还没有学到ds数据段吧?因为这里cs段同时存放两样东西,数据和指令,数据正如cs:来索引,而指令是cs:ip索引,cs:ip我们不用去改变它,它自动会递增的。您可能误会了一位cs:是指向指令的?对吧?您可以这么测试下,观察ip的值,看他是否等于bx的值。
问题二:YES,标号只是翻译成一个地址,由end 标号来告诉系统你的程序在标号处(地址)开始的。
问题三:cs当然可以和其他配合,像刚才把数据和代码都放在cs段,您可以cs:指向数据,cs:ip指向指令。呵呵没错,8086时代没有保护机制,所以您可以尽情乱搞~ 回复 5# 小甲鱼
:D :victory: 谢老师,懂啦。哈哈,老师英明 回复 4# shangyl00
我懂啦。你呢?不懂得话,下面有老师的解答。。。看看跟你想的有什么差别 本帖最后由 shangyl00 于 2011-4-15 08:54 编辑
回复shangyl00
我懂啦。你呢?不懂得话,下面有老师的解答。。。看看跟你想的有什么差别
小广哥 发表于 2011-4-14 20:41 http://fishc.com/dz/images/common/back.gif
汗颜啊,我那是民间说法~不过我们需要加油!
页:
[1]