《汇编语言》王爽-作业记录-第5章

第五章–[BX]和loop指令。

作业1&2: 编程,向内存0:200~0:23F依次传送数据0~63(3FH)。要求只能使用9条指令(含mov ax,4c00h和int 21h)。
分析:

  • 首先确定数据段(ds)为0,偏移量为200
  • 题目要求的是一段连续地址,存储一段连续数字,且两者一一对应,所以用一个变量来代替就好了,自然而然的想到用bx寄存器。但在赋值的时候应该要注意一个点:赋值分为“字节”赋值和“字”赋值。也就是对应着的长度不一样,因为我们这里是对内存单元即一个字节赋值,所以应该只使用到bx的低8位,而bx的低8位刚好是从零开始的,所以再次确定可以使用bx寄存器(这里可以想一下如果要求向0:210~0:24F区间赋值,你还可以使用bx寄存器吗?)
  • 赋值操作执行64次,cx寄存器应该赋值为多少?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    assume cs:code
    code segment
    mov ax,0
    mov ds,ax ;设置数据段
    mov bx,200H ;设置基础偏移
    mov cx,40H ;设置循环条件,因为break loop的条件是cx==0,所以设置40H而不是3FH

    s:
    mov [bx],bl
    inc bx
    loop s

    mov ax,4c00h
    int 21h
    code ends
    end
    OK,查看下效果:

作业3:下面程序的功能是将 “mov ax,4c00h”之前的指令复制到内存0:200处,请补全程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
assume cs:code
code segment
mov ax,?? ;!!!!!
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
mov cx,?? ;!!!!!

s:
mov al,[bx]
mov es:[bx],al
inc bx
loop s

mov ax,4c00h
int 21h
code ends
end

2019/11/10 目前学到这里,第二空暂时不知道正确答案,但是经过资料搜索,大体知道可以怎么编写程序,但需要修改源程序。所以这里留个坑,如果之后学到的知识可以填补,再来补吧。
第一个空显然应该填cs,因为cs指向我们的代码段的第一条指令。
重点放到第二个空,参考自:https://zhidao.baidu.com/question/62456534.html
对于任意一个汇编程序,cx存放的是总的指令长度(我一直在想,如果总指令长度超过FFFF了怎么办?),那么cx减去 mov ax,4c00h和 int 21h长度即可。

通过u指令查看,cx的确存放的是一个汇编的总指令长度,而mov ax,4c00h和 int 21h共占用5字节,所以可将程序修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
assume cs:code
code segment
mov ax,cs ;!!!!!
mov ds,ax
mov ax,0020h
mov es,ax
mov bx,0
;mov cx,?? ;!!!!! 注意这里不是标准答案,因为修改了源程序
sub cx,5

s:
mov al,[bx]
mov es:[bx],al
inc bx
loop s

mov ax,4c00h
int 21h
code ends
end

结果:

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×