实验三

任务一

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

 

debug反汇编

问题1:

loop s1指令的机器码是E2F2,其中F2就是转移的位移量的补码的形式。通过转换可以知道其原码是-14.所以其位移量就是-14。

从当前地址一直到076B:000D,用当前标号位置的偏移地址减去跳过的字节数,实现跳转.

问题2:

loop s2指令的机器码是E2F0,其中F0就是转移的位移量的补码的形式。通过转换可以知道其原码是-16.所以其位移量就是-16。

从当前地址一直到076B:0029,用当前标号位置的偏移地址减去跳过的字节数,实现跳转.

 

任务二

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

问题1:

call word ptr ds:【0】时得到ds:【0】中s1的段内偏移量跳转到s1并且将当前偏移量入栈,pop ax将该地址出栈存入ax。

call dword ptr ds:【2】时得到ds:【0】中s2的段内偏移量并跳转到s2,然后入栈段的地址,在入栈段内偏移地址,pop bx pop cx 将段内偏移地址存到bx 和段地址存入cx中

所以AX=offset s1 ,BX=offset s2 ,CX=code的段地址

问题2:

 

 

由图可以看出AX=s1的偏移量 BX=s2的偏移量,CX则是code段的段地址

 

任务三


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 bx,0
mov ax,data
mov ds,ax
mov cx,len
s:
call printNumber
call printSpace
loop s

mov ah,4ch
int 21h

printNumber:
mov al,[bx]
inc bx
mov ah,0
mov dl,10
div dl
OR al,30h
OR ah,30h
mov dh,ah
mov ah,2
mov dl,al
int 21h

mov ah,2
mov dl,dh
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 cx,len
mov ax,data
mov ds,ax
mov si,0
mov bl,2
mov bh,0
call printStr

mov cx,len
mov si,0
mov bl,4
mov bh,24
call printStr

mov ah,4ch
int 21h

printStr:
mov dl,bh
mov dh,0
mov ax,160
mul dx
mov di,ax
mov ax,0b800h
mov es,ax

mov ah,bl
s:
mov al,ds:[si]
inc si
mov es:[di],ax
add di,2
loop s
ret


code ends
end start

 

 

任务五

assume cs:code,ds:data
data segment
stu_no db '201983290255'
len=$ - stu_no
data ends
code segment
start:
mov ax,data
mov ds,ax
mov di,0
mov ax,0b800h
mov es,ax
mov si,0
mov bl,0
mov bh,23
mov cx,1920
s:
mov es:[si],bx
add si,2
loop s

mov cx,34
mov bl,45
s1:
mov es:[si],bx
add si,2
loop s1

mov cx,12
s2:
mov bl,ds:[di]
inc di
mov es:[si],bx
add si,2
loop s2

mov cx,34
mov bl,45
s3:

mov es:[si],bx
add si,2
loop s3

mov ah,4ch
int 21h

code ends
end start

 

 

posted @ 2021-11-26 11:43  1171021785  阅读(20)  评论(3)    收藏  举报