检测点9.2
补全编程,利用jcxz指令,实现在内存2000H段中查第一个值为0的字节,到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start: mov ax,2000h
        mov ds,ax
        mov bx,0
    s: mov ch,0   
      mov cl,[bx]
      jcxz ok        ;当cx=0时,CS:IP指向OK
      inc bx     
        jmp short s
    ok: mov dx,bx
        mov ax ,4c00h
        int 21h
code ends
end start
检测点9.3
补全编程,利用loop指令,实现在内存2000H段中查第一个值为0的字节,到后,将它的偏移地址存储在dx中。
assume cs:code
code segment
start:  mov ax,2000h
        mov ds,ax
        mov bx,0
      s:mov cl,[bx]
        mov ch,0
      inc cx     
        inc bx
        loop s
    ok:dec bx
        mov dx,bx
        mov ax,4c00h
        int 21h
code ends
end start
书P101,执行loop s时,首先要将(cx)减1。
“loop 标号”相当于
dec cx
if((cx)≠0) jmp short 标号
检测点10.1
补全程序,实现从内存1000:0000处开始执行指令。
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, 1000h
    push ax
    mov ax,  0 
    push ax
    retf
code ends
end start
执行reft指令时,相当于进行:
pop ip
pop cs
根据栈先进后出原则,应先将段地址cs入栈,再将偏移地址ip入栈。
检测点10.3
下面的程序执行后,ax中的数值为多少?
内存地址  机器码          汇编指令            执行后情况
1000:0    b8 00 00          mov ax,0          ax=0,ip指向1000:3
1000:3    9a 09 00 00 10    call far ptr s    pop cs,pop ip,ip指向1000:9
1000:8    40                inc ax
1000:9    58                s:pop ax          ax=8h
                            add ax,ax          ax=10h
                            pop bx            bx=1000h
                            add ax,bx          ax=1010h
用debug进行跟踪确认,“call far ptr s”是先将该指令后的第一个字节段地址cs=1000h入栈,再将偏移地址ip=8h入栈,最后转到标号处执行指令。
出栈时,根据栈先进后出的原则,先出的为ip=8h,后出的为cs=1000h
检测点10.4
下面的程序执行后,ax中的数值为多少?
内存地址  机器码        汇编指令      执行后情况
1000:0    b8 06 00      mov ax,6      ax=6,ip指向1000:3
1000:3    ff d0        call ax        pop ip,ip指向1000:6
1000:5    40            inc ax
1000:6    58            mov bp,sp      bp=sp=fffeh
                        add ax,[bp]    ax=[6+ds:(fffeh)]=6+5=0bh
用debug进行跟踪确认,“call ax(16位reg)”是先将该指令后的第一个字节偏移地址ip入栈,再转到偏移地址为ax(16位reg)处执行指令。
检测点10.5
(1)下面的程序执行后,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
    call word ptr ds:[0eh]
    inc ax
    inc ax
    inc ax
    mov ax,4c00h
    int 21h
code ends
end start
推算:
执行call word ptr ds:[0eh]指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:[0eh])。(ds:[0eh])=11h,执行inc ax……最终ax=3
题中特别关照别用debug跟踪,跟踪结果不一定正确,但还是忍不住去试试,看是什么结果。
根据单步跟踪发现,执行call word ptr ds:[0eh]指令时,显示ds:[0eh]=065D。
ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。
于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?中断呗~~~~
检测点10.5
(2)下面的程序执行后,ax和bx中的数值为多少?
assume cs:codesg
stack segment
    dw 8 dup(0)
stack ends
codesg segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,10h
位字符串是什么    mov word ptr ss:[0],offset s ;(ss:[0])=1ah
    mov ss:[2],cs                ;(ss:[2])=cs
    call dword ptr ss:[0]        ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令
                                ;(ss:[4])=cs,(ss:[6])=ip
    nop
s:  mov ax,offset s              ;ax=1ah
    sub ax,ss:[0ch]              ;ax=1ah-(ss:[0ch])=1ah-19h=1
    mov bx,cs                    ;bx=cs=0c5bh
    sub bx,ss:[0eh]              ;bx=cs-cs=0
    mov ax,4c00h
    int 21h
codesg ends
end start
C:\DOCUME~1\ADMINI~1>
-u
0C5B:0000 B85A0C        MOV    AX,0C5A
0C5B:0003 8ED0          MOV    SS,AX
0C5B:0005 BC1000        MOV    SP,0010
0C5B:0008 36            SS:
0C5B:0009 C70600001A00  MOV    WORD PTR [0000],001A
0C5B:000F 36            SS:
0C5B:0010 8C0E0200      MOV    [0002],CS
0C5B:0014 36            SS:
0C5B:0015 FF1E0000      CALL    FAR [0000]
0C5B:0019 90            NOP
0C5B:001A B81A00        MOV    AX,001A
0C5B:001D 36            SS:
0C5B:001E 2B060C00      SUB    AX,[000C]
-u
0C5B:0022 8CCB          MOV    BX,CS
0C5B:0024 36            SS:
0C5B:0025 2B1E0E00      SUB    BX,[000E]
0C5B:0029 B8004C        MOV    AX,4C00
课程设计一
将实验7中的Power idea公司的数据按照图所示的格式在屏幕上显示现来
table segment
    db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
    db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
    db '1993','1994','1995'
    dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
    dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649000,5937000
    dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。