实验2 多个逻辑段的汇编源程序编写与调试


任务1-1

 

(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) = 076C。

(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2h, stack的段地址是X-1h。

任务1-2

(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076B, 寄存器(CS) = 076C。

(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2h, stack的段地址是X-1h。

任务1-3

(1)在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS) = 076C, 寄存器(CS) = 076E。

(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-4h, stack的段地址是X-2h。

任务1-4

(1)在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = 076C, 寄存器(SS) = 076E, 寄存器(CS) = 076A。

(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X+2h, stack的段地址是X+4h。

任务1-5

 

(1)对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 2*[N/16] B。

(2)如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。

  答:task1_4.asm仍然可以正常运行,由任务1-1可知DS和CS之间的地址默认相差10h,如果没有指出程序的开始位置,程序默认从DS+10h开始运行,将end start改成end,使用-r查看寄存器,可以看到CS的值为076A,而非原来的076C,使用反汇编进行查看,可以发现CS开始的区域全部为0,没有可供执行的指令。

任务2

实验代码:

assume cs:code

code segment
start:
    mov ax,0b800h
    mov ds,ax
    mov bx,0f00h
    mov cx,50h;50h即80
    mov ax,0403h
s: mov ds:[bx],ax
    add bx,2
    loop s

    mov ah,4ch
    int 21h
code ends
end start

 运行结果:

 任务3

assume cs:code
data1 segment
    db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers
data1 ends

data2 segment
    db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0       ; ten numbers
data2 ends

data3 segment
    db 16 dup(0)
data3 ends

code segment
start:
    mov ax,data1
    mov ds,ax
    mov bx,0
    mov cx,0ah
s:
    mov ax,ds:[bx]
    add ax,ds:[bx+10h]
    mov ds:[bx+20h],ax
    inc bx
    loop s

    mov ah,4ch
    int 21h
code ends
end start

 反汇编:

相加前:

 相加后:

 任务4

实验代码:

assume cs:code,ss:stack

data1 segment
    dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends

data2 segment
    dw 8 dup(?)
data2 ends

stack segment
    dw 8 dup(?)
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,8

    mov ax,data1
    mov ds,ax
    mov bx,0
    mov cx,8
s:
    push [bx]
    add bx,2
    loop s

    mov ax,data2
    mov ds,ax
    mov bx,0
    mov cx,8
s2:
    pop [bx]
    add bx,2
    loop s2

    mov ah, 4ch
    int 21h
code ends
end start

 存储前:

 存储后:

任务5

运行结果:

答:line19的作用是将小写字母转换成大写字母。

将line 4修改为:db 5 dup(2),运行结果:

答:line4的作用是设置颜色。

任务6

 实验代码:

assume cs:code, ds:data, ss:stack

data segment
    db 'Pink Floyd      '
    db 'JOAN Baez       '
    db 'NEIL Young      '
    db 'Joan Lennon     '
data ends

stack segment
    dw 1 dup(?)
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,1

    mov ax,data
    mov ds,ax

    mov ax,data
    mov es,ax
    mov cx,4
s:
    push cx
    mov bx,0
    mov cx,4

s2:
    mov al,es:[bx]
    or al,20h
    mov es:[bx],al
    inc bx
    loop s2

    pop cx
    mov ax,es
    inc ax
    mov es,ax

    loop s

    mov ah, 4ch
    int 21h
code ends
end start

转换前:

 反汇编:

 转换后:

任务7

实验代码:

assume cs:code, ds:data, es:table,ss:stack

data segment
    db '1975', '1976', '1977', '1978', '1979'
    dd  16, 22, 382, 1356, 2390
    dw  3, 7, 9, 13, 28
data ends

table segment
    db 5 dup( 16 dup(' ') )  ;
table ends

stack segment
    dw 1 dup(?)
stack ends

code segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,1
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax

    mov di,0;data

;1
    mov bx,0;table
    mov si,0;table
    mov cx,5
year:
    push cx
    mov cx,4

year2:
    mov al,ds:[di]
    mov es:[bx+si],al
    inc si
    inc di
    loop year2

    pop cx
    add bx,10h
    mov si,0
    loop year

;2
    mov bx,0
    mov si,5
    mov cx,5
income:
    push cx
    mov cx,4

income2:
    mov al,ds:[di]
    mov es:[bx+si],al
    inc si
    inc di
    loop income2

    pop cx
    add bx,10h
    mov si,5
    loop income

;3
    mov bx,0
    mov si,10
    mov cx,5
num:
    push cx
    mov cx,2

num2:
    mov al,ds:[di]
    mov es:[bx+si],al
    inc si
    inc di
    loop num2

    pop cx
    add bx,10h
    mov si,10
    loop num

;4
    mov bx,0
    mov si,5
    mov cx,5
cal:
    mov ax,word ptr es:[bx+si]
    add si,2
    mov dx,word ptr es:[bx+si]
    add si,3
    div word ptr es:[bx+si]
    add si,3
    mov word ptr es:[bx+si],ax

    add bx,10h
    mov si,5
    loop cal

    mov ah, 4ch
    int 21h
code ends
end start

运行结果:

 结构化写入后:

 

相关