汇编语言.实验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