. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->更灵活的定位内存地址的方法
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第七章论坛检测题解答  [待解决] 回复[ 22次 ]   点击[ 1414次 ]  
debugkkk
[帖 主]   [ 发表时间:2008-05-26 18:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:16
注册日期:2008-03-17 20:21
生成EXE之后用Debug加载后,查看寄存器内容如下: 
    ds=0b2d es=0b2d ss=0b3d cs=0b3e ip=0000 
    程序的起始地址的段地址是_____。 3
 1、 0b3e 
 2、 0b2d 
 3、 0b3d 
 4、 0 
注解:详见课本P86页,PSP段的段地址为SA,,可用段地址为SA+10,即程序的起始地址的段地址=ds+10h


下列指令不能执行的是_____。 3
 1、 mov ax,10h[bx] 
 2、 mov ax,10h[di] 
 3、 mov ax,[di+si] 
 4、 mov ax,10h[bx][si] 
注解:详见课本P134,SI和DI是8086CPU中功能详见的寄存器,SI和DI不能分成两个8位寄存器来使用。

对如下程序要实现将datasg段中的字符串"welcome to masm!"复制到它后续的数据区中, 
    assume cs:codesg,ds:datasg 
    datasg segment 
    db 'welcome to masm!' 
    db '................' 
    datasg ends 
    codesg segment 
    start: mov ax,datasg 
    mov ds,ax 
    mov si,0 
    ________ 
    ________ 
    mov ax,4c00h 
    int 21h 
    codesg ends 
    end start 
    在空白区域添加的指令序列合理的是_____。 4
 1、 mov di,10h 
    mov cx,10h 
    s: mov ax,[si] 
    mov [di],ax 
    add si,2 
    add di,2 
    loop s 
 2、 mov di,10h 
    mov cx,8 
    s: mov ax,[si] 
    mov [di],ax 
    inc si 
    inc di 
    loop s 
 3、 mov ss,ax 
    mov sp,32  
    mov cx,8 
    s: mov ax,[si] 
    push ax 
    add si,2 
    loop s 
 4、 mov cx,8 
    s: mov ax,[si] 
    mov [si+10h],ax 
    add si,2 
loop s


三人行必有我师,欢迎大家拿出自己的观点
mess
[第1楼]   [ 回复时间:2008-05-29 09:29 ]   [引用]   [回复]   [ top ] 
荣誉值:337
信誉值:0
注册日期:2008-01-01 17:48
呵呵,题都对了网站该有提示了,把不清楚的可以拿出来讨论讨论,这样发上来可能让别人偷懒了,反而害了人家;)
wyh
[第2楼]   [ 回复时间:2008-05-31 15:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-05-26 16:47
我第一题错了,把PSP给忘了
谢..
linuxmax
[第3楼]   [ 回复时间:2008-06-19 11:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-06-10 05:21
下列指令不能执行的是_____。 3 
 1、 mov ax,10h[bx]  
 2、 mov ax,10h[di]  
 3、 mov ax,[di+si]  
 4、 mov ax,10h[bx][si]  
注解:详见课本P134,SI和DI是8086CPU中功能详见的寄存器,SI和DI不能分成两个8位寄存器来使用。

mov ax,[di+si] 这个不太明白,是不能分成两个8位的,你怎么知道他当8位的用了
poiuytr81
[第4楼]   [ 回复时间:2008-07-11 22:32 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-06-27 20:49
试答:因为ax,是16位的,而[di+si]仍是8位寄存器,因前后不一致,故不能执行
towersimper
[第5楼]   [ 回复时间:2008-07-14 15:55 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16
是啊。有道理啊。程序的起始地址与实际指令的执行起始地址是有区别的。
ym3823078
[第6楼]   [ 回复时间:2008-07-20 14:31 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-18 07:43
mov ax,[di+si] 这个不太明白,
-----------------------------------------------
mov ax,[di+si]   中的 di和si,不能一起 用,这个就 是 错误 的 根本原因!
towersimper
[第7楼]   [ 回复时间:2008-07-23 21:26 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16
是的。si或者di要么独立使用,要么与bx或bp联合使用。当然idata也可以。
有一下几种形式:
[si],[si+idata],[si+bx],[si+bp],[si+bx+idata],[si+bp+idata]
同样si也是如此。
towersimper
[第8楼]   [ 回复时间:2008-07-23 21:26 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16
写错了,是di也是如此。
hzccheng
[第9楼]   [ 回复时间:2008-08-03 13:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-22 15:49
生成EXE之后用Debug加载后,查看寄存器内容如下:  
    ds=0b2d es=0b2d ss=0b3d cs=0b3e ip=0000  
    程序的起始地址的段地址是_____。 3 
 1、 0b3e  
 2、 0b2d  
 3、 0b3d  
 4、 0  
对于这道题我想问个问题,程序的起始地址等于DS+10H这个我已经知道,可是这里的cs=0b3e,就表示0b3d并不在代码段里面,这样也能是程序的起始地址么,请高手解答
towersimper
[第10楼]   [ 回复时间:2008-08-04 12:24 ]   [引用]   [回复]   [ top ] 
荣誉值:9
信誉值:3
注册日期:2008-06-12 09:16
我想你可能只见到程序的起始处的段地址为cs的程序代码。想想,如果一个程序有多个段,如data数据段,stack栈段,table表段,代码段code等等,在这些段的放置顺序当中,从前之后依次为,data,stack,table,code,即将code代码放到最后,那么程序的起始处的段地址为data段的段地址,加上一定的偏移量后才是code的段地址。
举例如下。
assume ds:data,cs:code
data segment
dw 0,0,0,0,0
data ends
code segment
start:----------(代码段内容省略)
code ends
end start
如果,ds=0b2d,那么data=0b3d. code=0b3e.
因此,你要区分程序的起始处和程序实际执行处的区别。该段程序的起始处为data段,而实际执行代码处为code段。这里,0b3d在程序里面,只不过在程序的data段中,用来存放程序所需读取的数据或者往里面写入数据
hanlsheng
[第11楼]   [ 回复时间:2009-01-04 16:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17
这个问题主要是 大家对程序这个词还没有理解透喔。
课本p79(第二版)开始部分“2.源程序中的“程序””
最后一句话:这里说的程序就是指源程序中最终由计算机执行、处理的指令或数据。

大家看清楚了,程序不仅仅指指令,还有数据啊,但这个数据是是计算机要处理的数据,是客户的数据(客户要使用的,计算的)。
hanlsheng
[第12楼]   [ 回复时间:2009-01-04 16:50 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2008-12-15 16:17
还有大家真正理解了cs,ds,es,ss ,ip 里内容的作用,好加载后这些数据的关系。这样就好了。别针对个别的问题非得整个标准答案。理解了就好了!!
tianyu_lianxin
[第13楼]   [ 回复时间:2009-01-15 16:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-12-12 12:10
试答:因为ax,是16位的,而[di+si]仍是8位寄存器,因前后不一致,故不能执行
------------------
回复:书上说di和si不能分成2个8位寄存器使用,没将它就是8位寄存器啊?
second
[第14楼]   [ 回复时间:2009-04-16 09:10 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-03-22 17:01
si和di本身是16位寄存器吧。
和ax是一樣的。有误导吧。
skyku
[第15楼]   [ 回复时间:2009-04-23 20:08 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-02-27 19:42
si和di本身是16位寄存器吧。 
和ax是一樣的。有误导吧。

同感!
okenny
[第16楼]   [ 回复时间:2010-04-08 15:40 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2009-12-18 17:03
si和di都是16位的寄存器啊。。。书上的意思是不能分为SH或SL等8位吧。。。
cxpbl
[第17楼]   [ 回复时间:2010-10-06 14:44 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2010-09-16 18:13
楼上正解,si和di本身也是16位寄存器,只不过不能分成两个8位寄存器,还有不能一起使用。
hillk
[第18楼]   [ 回复时间:2011-05-08 20:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-04-25 00:59
寄存器间接寻址里面 ,只能是基址和变址相加减,不能两个基址寄存器相加减,或两个变址寄存器相加减。
基址寄存器 bx,bp
变址寄存器 si,di
gdutxzy
[第19楼]   [ 回复时间:2011-05-27 11:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-02-13 09:38
我答错3次了,日,我错的是最后一题,第一次选1,因为16个字母嘛,我就以为循环10H次,后来明白了就选2,因为没看清楚就选了,再后来以为是其它题错了。
smasm
[第20楼]   [ 回复时间:2012-11-02 11:48 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-09-27 15:52
我错了第一个,理解成程序段的段地址了!
pkingsha
[第21楼]   [ 回复时间:2013-02-18 00:26 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2013-02-02 01:48
十楼正解,程序起始地址和程序执行入口是不一样的。
hky987654321
[第22楼]   [ 回复时间:2013-07-29 00:10 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
第八章,p162页有答案:mov ax,[di+si]是错误的。原因可能是硬规定,或王老师为方便教学屏蔽了,只记两者不同时出现就好。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved