实验三 转移指令跳转原理简单应用编程

assume cs:code, ds:data

data segment

x db 1, 9, 3

len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3

y dw 1, 9, 3

len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9

data ends

code segment

start:

mov ax, data

mov ds, ax

mov si, offset x ; 取符号x对应的偏移地址0 -> si

mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx

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 ; 取符号y对应的偏移地址3 -> si

mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx

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其后指令的偏移地址的。

12

 

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

 

14

③ 附上上述分析时,在debug中进行调试观察的反汇编截图

 

 实验二

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

 

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

 

ax=0021;bx=0026;cx=076C

在执行call指令时,cpu将下一条指令(ip或cs)压入栈,此后pop ax会将该内容出栈给ax,pop bx会将ip出栈给bx,pop cx会将cs出栈给cx。


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

 

一致

实验三

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 cx,len

mov si,offset x

s:

mov ah,0

mov al,ds:[si]

call printNumber

call printSpace

inc si

loop s

 

mov ah,4ch

int 21h

 

printNumber:

mov bl,10

div bl

mov bh,ah

mov dl,al

or dl,30h

 

mov ah,2

int 21h

 

mov dl,bh

or dl,30h

int 21h

ret

 

printSpace:

mov ah,2

mov dl,' '

int 21h

ret

 

code ends

end start

 实验四

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 bl, 2

    mov bh, 0

    call printStr

 

    mov bl, 4   

    mov bh, 24

    call printStr

 

    mov ah, 4ch

    int 21h   

 

printStr:

    mov ax, 0b800h

    mov es, ax

 

    mov si, offset str

    mov cx, len 

 

    mov ax, 00a0h

    mul bh

    mov di, ax

 

s:  mov al, [si]

    mov es:[di], al

    mov es:[di+1], bl

    inc si

    add di, 2

    loop s   

    ret

 

code ends

end start

 

 

与预期实验结果一样

实验五

编写后代码

assume cs:code ds:data

 

data segment

stu_no db '201983290217'

len = $ - stu_no

data ends

 

code segment

start:

    mov ax,data

    mov ds,ax

    mov bx,0

 

    mov ax,0b800h

    mov es,ax

    mov cx,80

    mov si,0f00h

    mov dl,'-'

s1: mov es:[si],dl;将最后一行全部填充-

    add si,2

    loop s1

 

    mov cx,len

    mov si,0f44h

s2: mov dl,ds:[bx];从最后一行68字节开始填充学号

    mov es:[si],dl

    add si,2

    inc bx

    loop s2

 

    mov cx,2000

    mov si,1

    mov dl,17h

s3: mov es:[si],dl;全部填充蓝色

    add si,2

    loop s3

 

    mov ax,4c00h

    int 21h

 

code ends

end start

 

posted @ 2021-11-30 08:25  ABoDE  阅读(8)  评论(1编辑  收藏  举报