现在的位置: 首页 > 综合 > 正文

几道汇编题目

2017年07月29日 ⁄ 综合 ⁄ 共 3199字 ⁄ 字号 评论关闭

 

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

抱歉!评论已关闭.