|
主题 : : 第十章汇编测试题目 答案! [待解决] |
回复[ 4次 ]
点击[ 937次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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
理由:看上面的;部分 | | |
|
|
|
|
[第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小时后了。。 | | |
|
|
|
|
[第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]内存中的值。我认为。
没想到
段定义 和标号就是一回事,只是平时放在位置不同。段定义多个段而已。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2009-07-09 17:07 ]
[引用]
[回复]
[ top ] | |
荣誉值:31
信誉值:3
注册日期:2009-06-15 19:20 |
To 2#:bp作偏移地址使用时默认段地址在ss中=。=
To LZ:'人的思维一旦走进误区是很难发现自身的盲点的'很赞同啊。。。 | | |
|
|
|
|
[第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. | | |
|