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 。
下面的程序执行后,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码转换的二进制存储的;
而对数字数据内存里直接就是数字。
例:
db 'a'----->内存单元里为a的ASCII码
db '1'----->这里将“1”作为字符处理,所以内存里是1的ascii码为31H.
db 1------>这里“1”为数字,内存单元里依然为01H,即0000 0001.
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