汇编语言.实验3

实验任务1

源代码

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

运行截图

问题

问题1

位移量是-14

CPU在识别出指令loop之后,立即查看它的下一个字节,然后将其与loop指令下一行的指令的ip中的内容做减法,就得到了指令后的偏移地址。

从本题来看,loop指令所在行的数据是E2F2。其中E2代表loop指令,那么就得到了位移量F2。它是用补码存储的,转换成原码之后就是-14。CPU这时就运行(ip) = (ip) + F2的操作,而(ip)的值为1B,那么运行结束后,ip中的值就是0D(只看低八位,溢出舍去)。

问题2

位移量是-16

分析同上

问题3

问题1的反汇编

问题2的反汇编

实验任务2

源代码

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) = 21
(bx) = 26
(cx) = 0
;在debug中找到的正确结果如下:
(ax) = 21
(bx) = 26
(cx) = 076C

运行截图

开始

运行结束

实验任务3

源代码

由于int 21h的2号子功能只能输出单个字符,所以这里用div指令将高位和低位分别存储,注意寄存器的覆写即可。

assume cs:code, ds:data

data segment
        x db 99, 72, 85, 63, 89, 97, 55
        len equ $ - x
data ends

code segment
main:   mov ax, data
        mov ds, ax

        mov si, offset x
        mov cx, len
s1:     mov ah, 0
        mov al, [si]
		call printNumber
        call printSpace

        inc si
        loop s1

        mov ax, 4c00h
        int 21h

printNumber:
        ;high 
        mov bl, 10
        div bl
        mov bx, ax
        mov dl, bl
        or dl, 30h
        mov ah, 2
        int 21h
        ;low
        mov dl, bh
        or dl, 30h
        mov ah, 2
        int 21h
        ret

printSpace:
        mov dl, ' '
        mov ah, 2
        int 21h
        ret

code ends
end main

运行结果

实验任务4

源代码

注意不能直接从ds送数据到es

assume cs:code, ds:data

data segment
        str db 'try'
        len equ $ - str
data ends

code segment
main:   mov ax, data
        mov ds, ax

        mov si, offset str
        mov cx, len
        mov bl, 02h
        mov bh, 0
        call printStr

        mov si, offset str
        mov cx, len
        mov bl, 04h
        mov bh, 24
        call printStr

        mov ax, 4c00h
        int 21h

printStr:
        mov ax, 0b800h
        mov es, ax

        mov al, 0a0h
        mul bh 
        mov di, ax
s:      mov ah, ds:[si]
        mov es:[di], ah
        mov es:[di]+1, bl

        add di, 2
        inc si
        loop s
        ret
        
code ends
end main

运行结果

实验任务5

源代码

assume cs:code, ds:data

data segment
        stu_no db '201913930075'
        len = $ - stu_no
data ends

code segment
main:   mov ax, data
        mov ds, ax

        mov ax, 0b800h
        mov es, ax

        mov di, 1
        mov cx, 4000
s:      mov ah, 17h
        mov es:[di], ah
        add di, 2
        loop s

        mov bx, 0f00h
        call print

        mov si, offset stu_no
        mov di, 68
        mov cx, len
        mov ah, 17h
s2:     mov al, ds:[si]
        mov es:[di+bx], al
        mov es:[di+bx]+1, ah
        
        inc si
        add di, 2
        loop s2

        mov bx, 0f5ch
        call print

        mov ax, 4c00h
        int 21h

print:  mov di, 0
        mov cx, 34
        mov ah, '-'
        mov al, 17h
s1:     mov es:[bx+di], ah
        mov es:[bx+di]+1, al

        add di, 2
        loop s1
        ret
code ends
end main

运行结果

posted @ 2021-11-23 21:04  萤追月  阅读(82)  评论(1编辑  收藏  举报