实验4 【bx】和 loop 的使用

发布时间 2023-07-08 16:32:27作者: 三年、

实验4 【bx】和 loop 的使用

第一问

  1. 编程,向内存0:200~0:23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“mov ax,4c00h”和"int 21h"。

    assume cs:code
    code segment
    mov ax,0h
    mov ds,ax # 设置段前缀
    mov bx,200h
    mov ax,0 # 设置ax从0~63
    mov cx,64
    s: mov ds:[bx],ax
    inc ax
    inc bx
    loop s

    mov ax,4c00h
    int 21h

    code ends
    end
  2. 下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0~0:200处,补全程序。上机调试,跟踪运行结果。

    程序如下(File:LabFour2.asm):

    assume cs:code

    code segment
    mov ax,_(1)_
    mov ds,ax
    mov ax,0020h
    mov es,ax
    mov bx,0
    mov cx,_(2)_

    s:
    mov al,[bx]
    mov es:[bx],al
    inc bx
    loop s
    mov ax,4c00h
    int 21h
    code ends
    end

    提示: (1)复制的是什么?从哪里到哪里? 答:复制的是程序的指令,从"mov ax,(1)“开始到"loop s”。 (2)复制的什么?有多少个字节?你如何知道要复制的字节的数量 复制的是程序的指令,先运行程序,根据CX寄存器的值知道程序的长度(字节)。然后在减去从"mov ax,4c00h"指令开始的程序长度。

 

  • (1空):CS

    根据题意将“mov ax,4c00h”之前的指令复制到内存0~0:200处。根据程序上下文已经有0020所以ax=“程序的开头处地址”,即ax=cs。cs寄存器存放代码段寄存器。

  • (2空):23。 我们先让(2空)为2即mov cx,2,debug运行程序 我们可以发现 CX=001CH 从“mov ax,4c00h”开始的指令的机器指令是B8 00 4C CD 21,占了5个字节。所以在本实验中我们要复制的代码字节数为001CH-0005H=0017H=23个字节,故CX赋值为23或17H。

    • 在填第二个空那里,cx通用寄存器他有一个特点,就是在我们载入这个程序时,他会记录目前你这个程序有多长,显然这个程序有多长是code segment和code ends里面所有程序的长度,但是我们并不需要mov ax,4c00h及之后的int 21h这两句,因此我们需要扣除这两句的长度(长度为5),即sub cx,5。当然,如果严格按照mov cx,___来写,那么就需要知道mov ax,4c00h之前所有指令的长度,这个长度的确定要比用sub难得多,除非你自己能记得大概的字节长度,否则你得调试出来一个个看。