实验三

1. 实验任务1

 

给出程序task1.asm源码,及运行截图

assume cs:code, ds:data

 

data segment

    x db 1, 9, 3

    len1 equ $ - x

 

    y dw 1, 9, 3

    len2 equ $ - y

data ends

 

code segment

start:

    mov ax, data

    mov ds, ax

 

    mov si, offset x

    mov cx, len1

    mov ah, 2

 s1:mov dl, [si]

    or dl, 30h

    int 21h

 

    mov dl, ' '

    int 21h

 

    inc si

    loop s1

 

    mov ah, 2

    mov dl, 0ah

    int 21h

 

    mov si, offset y

    mov cx, len2/2

    mov ah, 2

 s2:mov dx, [si]

    or dl, 30h

    int 21h

 

    mov dl, ' '

    int 21h

 

    add si, 2

    loop s2

 

    mov ah, 4ch

    int 21h

code ends

end start

 

 

 

 

回答问题①

① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。

 

 

 从001b跳到000d,位移量为-14。偏移地址为loop指令到s1之间指令的长度(指令字符串长度为28,即14个字节)。

 

 

回答问题②

② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。

 

 

从0039跳到0029,偏移量为-16。方法同上

 

2. 实验任务2

此部分书写内容:

 

给出程序task2.asm源码

 

 

assume cs:code, ds:data

 

data segment

    dw 200h, 0h, 230h, 0h

data ends

 

stack segment

    db 16 dup(0)

stack ends

 

code segment

start:

    mov ax, data

    mov ds, ax

 

    mov word ptr ds:[0], offset s1

    mov word ptr ds:[2], offset s2

    mov ds:[4], cs

 

    mov ax, stack

    mov ss, ax

    mov sp, 16

 

    call word ptr ds:[0]

s1: pop ax

 

    call dword ptr ds:[2]

s2: pop bx

    pop cx

 

    mov ah, 4ch

    int 21h

code ends

end start

 

给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。

① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) =? 寄存器(bx) = ? 寄存器(cx) =

line 24 将下一条语句IP(s1)进栈,并且转移到ds[0](存放了s1的地址)所指向地址.

line 25 将当前栈顶指针指向数据赋值给ax,由上文可知是s1标号IP地址

line 27将下一条语句CS进栈,IP进栈,程序跳转到ds[2]所指向地址(s2地址)。

line 28 将当前栈顶指针指向数据赋值给bx,即s2的IP地址

line 28 将当前栈顶指针指向数据赋值给cx 即CS值

 

② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论分析结果是否一致。

 

 

 

 

如图,与分析结果一致。

 

 

3. 实验任务3

此部分书写内容:

给出程序源码task3.asm

assume cs:code, ds:data

 

data segment

    x db 99,72,85,63,89,97,55

    len equ $ - x

data ends

 

code segment

start:

    mov ax,data

    mov ds,ax

 

    mov si,offset x

    mov cx,len

    mov byte ptr ds:[7], 10

 

s1:

    mov ah, 0

    mov al, ds:[si]

    div byte ptr ds:[7]

 

    call printNumber

    call printSpace

 

    inc si

    loop s1

 

    mov ah,4ch

    int 21h

 

printNumber:

    mov bx,ax

    mov ah, 2

 

    mov dl,al

    or dl, 30h

    int 21h

 

    mov dl,bh

    or dl,30h

    int 21h

ret

printSpace:

    mov ah, 2

    mov dl,' '

    int 21h

ret

 

code ends

end start

运行测试截图

 

 

4. 实验任务4

此部分书写内容:

给出程序源码task4.asm

 

assume cs:code,ds:data

 

data segment

    str db 'try'

    len equ $-str

data ends

 

code segment

start:

    mov ax,data

    mov ds,ax

 

    mov ax,0b800h

    mov es,ax

    mov bx,0h;第一行

 

    mov si,offset str

    mov cx,len

s1:

    mov dl,[si];低位存放字符Ascii码

    mov es:[bx],dl

    mov dl,2h;设置属性

    mov es:[bx+1],dl;属性放入显示地址 高位地址

 

    add bx,2

    inc si

    loop s1

 

    mov bx,0f00h;第25行

    mov cx,len

    mov si,offset str

s2:

    mov dl,[si];低位存放字符Ascii码

    mov es:[bx],dl

    mov dl,4h;设置属性

    mov es:[bx+1],dl;属性放入显示地址 高位地址

 

    add bx,2

    inc si

    loop s2

 

 

    mov ah,4ch

    int 21h

code ends

end start

 

运行测试截图

 

 

5. 实验任务5

此部分书写内容:

给出程序源码task5.asm

assume cs:code, ds:data

 

data segment

stu_no db '20192375030'

    len = $ - stu_no

data ends

 

code segment

start:

    mov ax, data

    mov ds, ax

    mov ax, 0b800h

    mov es, ax

 

     mov si, 1

     mov dl, 17h

     mov cx, 2000

  bc:mov es:[si], dl

     add si, 2

    loop bc

 

     mov dh, 24

     mov al, 160

     mul dh

     mov bx, ax

     call minus

 

     mov si, 0

     mov cx, len

  s1:mov dl, [si]

     mov es:[bx], dl

     add bx, 2

     inc si

     loop s1

 

     call minus

     mov ax, 4c00h

     int 21h

 

 minus:

     mov dl, '-'

     mov cx, 34

   s:mov es:[bx], dl

     add bx, 2

     loop s

     ret

code ends

end start

运行测试截图

 

posted @ 2021-12-03 09:32  Fanerr  阅读(78)  评论(3编辑  收藏  举报