. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第十章汇编测试题目 答案!  [待解决] 回复[ 4次 ]   点击[ 937次 ]  
zhenglxd
[帖 主]   [ 发表时间:2009-05-29 13:38 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
写这个是因为我有相当长的时间内没过第十章包括现在,我上论坛没找到答案,但是我最终还是搞懂了,我现在把我答题的思路写下来,因为人的思维一旦走进误区是很难发现自身的盲点的,希望大家通过我对于题目的理解来完善自身的思维,走出自己的盲区!

1 。
下列哪条指令不能够使CS:IP指向当前内存段范围内以s为标号的代码段______。 
1、 jmp near ptr s 
2、 jmp far ptr s 
3、 call near ptr s 
4、 call word ptr s
答案:2
理由:far指令 作用是 把cs:ip 指向标号 s所在的segment:ip,我们无法确定s所在的段地址和cs段相等,所以选2。

2 。
下面的程序执行后,ax中的数值为多少____ 
内存地址 机器码 汇编指令 
1000:0 b8 00 00 mov ax,0 
1000:3 e8 01 00 call s 
1000:6 40 inc ax 
1000:7 58 s:pop ax  
答案: ax=6
理由 mov ax,0(ax=0)---call s(push 6,ip=7) ---pop ax (ax=6)

3 .
某程序中定义了如下数据: 
data segment 
db "Hello" 
db 'world' 
db "!" 
db 'W','elcome' 
db "to","masm!" 
db "Bye",'b','ye!' 
dw 0,1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh 
dd 16 dup (0) 
data ends 
下列说法正确的是______。 
1、 该程序加载后其中的字符数据和数字数据在内存中都是以ASCII码的形式存放的。 
2、 该程序加载后这组数据在内存中所占用实际空间是90HB。 
3、 该数据段定义可放在该程序中end伪指令之前的任何位置。 
4、 在编译阶段,该程序因如此定义数据而报错。
答案 3
理由 1.错误 只要是存放在内存中的数据不管他是什么都是二进制形式。正确的说法应该为                        该程序加载后其中的字符数据和数字数据 为用  ASCII码的编码规则 转换为的二进制信息。
    2.错误  db定义的数据 32b ,dw定义的数据32b ,dd定义的数据64b 一共为80Hb
    3.正确 因为 就像标号代表偏移地址一样,段号代表的仅仅是段的起始地址,通过编译后可以直接被程序所调用。就好象变量名和变量的作用。一个变量被存放于内存中,我们通过地址来索引他,或者给他起个变量名通过名字来索引他。
    4. 错误 该程序完全合法

4 。
下面的程序执行后,ax中的数值是多少____
内存地址 机器码 汇编指令 
1000:0 b8 00 00 mov ax,6 
1000:2 ff d0 call ax 
1000:5 40 inc ax 
1000:6 mov bp,sp 
add ax,[bp]  
答案 : ax=11
理由 :mov ax,6(ax=6)--call ax(push 5,ip=6)--mov bp,sp(bp=sp)--add ax,[bp](=add ax,ss:sp ss:sp指向的数据是 5 就是前面被压入栈内的数据,所以最终ax=11)

5.
下面指令执行后,ax中的数值为多少____ 
内存地址 机器码 汇编指令 
1000:0 b8 00 00 mov ax,0 
1000:3 9a 09 00 00 10 call far ptr s 
1000:8 40 inc ax 
1000:9 58 s:pop ax 
add ax,ax 
pop bx 
add ax,bx 
答案:ax=1010H
理由:mov ax,0(ax=0)---call far ptr s(push 1000H,push 8)--pop ax( ax=8)--add ax,ax(ax=16)
--pop bx(bx=1000H)--add ax,bx(ax=ax+bx=16+1000H=1010H)

6.
补全程序,实现从内存1000:0处开始执行指令。 
assume cs:code 
stack segment 
db 16 dup(0) 
stack ends 
code segment 
start: mov ax,stack 
mov ss,ax 
mov sp,16 
mov ax,____ 
push ax 
mov ax,____ 
push ax 
retf 
code ends 
end start 
1、 cs,ip 
2、 0,1000h 
3、 1000h,0 
4、 0,1000
答案:选3  
理由:retf 这个操作是 pop ip,pop cs,然后执行cs : ip 所以 本题的程序要进行反操作 就是先push cs 再push ip,本体要求是  实现从内存1000:0处开始执行指令。 所以自然选3

7.
对下列程序说法正确的是_____。 
assume cs:codesg 
stack segment 
dw 10 dup (0) 
stack ends 
codesg segment 
mov ax,4c00h 
int 21h 
start: mov ax,stack 
mov ss,ax 
mov sp,20 
mov ax,0 
push cs 
push ax 
mov bx,0 
retf 
codesg ends 
end start 
1、 程序中start之后的汇编指令不能得到执行。 
2、 程序加载后stack段在内存中实际占用的内存空间是20b。 
3、 程序的每一条指令都能获得执行,但不能正常返回。 
4、 指令retf可替换为ret,并能够正常返回。 
答案:4
理由:1。错误 因为end start 所以程序 程序从start 开始
      2. 错误 因为段的大小必须为16的倍数,所以他实际占用空间应该是32b
      3.错误 retf后 ip=0 cs=cs,程序跳转到mov ax,4c00h
      4.正确 因为本题中 栈内的cs并未被改变 所以执行后ip =0 cs=cs依然可以返回

8.
下面的程序执行完add ax,5时,ax中的数值为多少____
                     assume cs:code
                     stack segment
                      dw 8 dup(0)
                     stack ends
                     code segment
                     start: mov ax,stack
                      mov ss,ax
                      mov sp,16
                      mov ds,ax
                      mov ax,0         ;ds和ss指向stack sp=16 ax=0
                      call word ptr ds:[0EH]  ; s的偏移地址被压入栈底,同时程序跳转到s
            s:      add ax,2               ;ax=2
                      inc ax                ;ax=3
                      add ax,5             ;ax=8
                      mov ax,4c00H
                      int 21H
                     code ends
                     end start
答案 ax=8
理由:看上面的;部分
zhenglxd
[第1楼]   [ 回复时间:2009-05-30 09:28 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:0
注册日期:2009-04-09 10:05
纠正第一题
1 。
下列哪条指令不能够使CS:IP指向当前内存段范围内以s为标号的代码段______。 
1、 jmp near ptr s 
2、 jmp far ptr s 
3、 call near ptr s 
4、 call word ptr s
答案:4
理由:call word后 必须明确给出 内存单元 而非标号。。这种概念性的题目我果然还是不行。这次考试又失败了。。痛苦估计要 16小时后了。。
zdpopup
[第2楼]   [ 回复时间:2009-06-27 22:18 ]   [引用]   [回复]   [ top ] 
荣誉值:8
信誉值:10
注册日期:2009-06-18 18:17
上面这句很搞笑啊。
这种概念性的题目我果然还是不行。这次考试又失败了。。痛苦估计要 16小时后了。。
呵呵
其它理由写得不错。
我2次都错在
该程序加载后其中的字符数据和数字数据在内存中都是以ASCII码的形式存放的,以为是对。
该数据段定义可放在该程序中end伪指令之前的任何位置。
想当然认为不能放CODE中或循环中,没想到是错的。看你说了,我再测试下发现你说的对。

还有就是我认为你放的第4题是没有答案的
add ax,[bp]  [bp]不是bp DS都不清楚,没法知道[BP]内存中的值。我认为。
没想到
段定义 和标号就是一回事,只是平时放在位置不同。段定义多个段而已。
tsembrace
[第3楼]   [ 回复时间:2009-07-09 17:07 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
To 2#:bp作偏移地址使用时默认段地址在ss中=。=
To LZ:'人的思维一旦走进误区是很难发现自身的盲点的'很赞同啊。。。
tsembrace
[第4楼]   [ 回复时间:2009-07-10 11:52 ]   [引用]   [回复]   [ top ] 
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20
------------------------
3 . 
某程序中定义了如下数据:  
data segment  
db "Hello"  
db 'world'  
db "!"  
db 'W','elcome'  
db "to","masm!"  
db "Bye",'b','ye!'  
dw 0,1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh  
dd 16 dup (0)  
data ends  
下列说法正确的是______。  
1、 该程序加载后其中的字符数据和数字数据在内存中都是以ASCII码的形式存放的。  
2、 该程序加载后这组数据在内存中所占用实际空间是90HB。  
3、 该数据段定义可放在该程序中end伪指令之前的任何位置。  
4、 在编译阶段,该程序因如此定义数据而报错。 
答案 3 
理由 1.错误 只要是存放在内存中的数据不管他是什么都是二进制形式。正确的说法应该为                        该程序加载后其中的字符数据和数字数据 为用  ASCII码的编码规则 转换为的二进制信息。 
----------------------------------------
我觉得这样的解释有些问题,字符数据在内存里是用AscII码转换的二进制存储的;
而对数字数据内存里直接就是数字。
例:
db 'a'----->内存单元里为a的ASCII码
db '1'----->这里将“1”作为字符处理,所以内存里是1的ascii码为31H.
db  1------>这里“1”为数字,内存单元里依然为01H,即0000 0001.
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved