验证性实验:有些汇编指令会影响到标志寄存器中的一个或多个状态标志位。
在debug环境中,分别实践、观察:
① add指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
② inc指令对标志寄存器中的零标志位ZF(Zero Flag)、进位标志位CF(Carry Flag)是否有影响?
使用任意文本编辑器,录入8086汇编源码task1.asm。
task1.asm
assume cs:code, ds:data
data segment
x dw 1020h, 2240h, 9522h, 5060h, 3359h, 6652h, 2530h, 7031h
y dw 3210h, 5510h, 6066h, 5121h, 8801h, 6210h, 7119h, 3912h
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset x
mov di, offset y
call add128
mov ah, 4ch
int 21h
add128:
push ax
push cx
push si
push di
sub ax, ax
mov cx, 8
s: mov ax, [si]
adc ax, [di]
mov [si], ax
inc si
inc si
inc di
inc di
loop s
pop di
pop si
pop cx
pop ax
ret
code ends
end start
其中:
add128是子程序子程序。
功能:实现计算两位128位数的加法
入口参数:
ds:si指向存储第一个128位数的存储空间(因为一个数128位,需要8个字节的连续空间)
ds:di指向存储第二个128位数的存储空间
出口参数:
加运算后的结果,保存在第一个数的存储空间中,即:ds:si开始的连续8个字节空间
在代码段种,调用add128实现对标号x和y处存储的两个128位数据相加,结果保存在x处的连续128个字
节中。
对程序进行汇编、链接,得到可执行程序task1.exe。在debug中调试程序,并回答问题。
① line31~line34的4条inc指令,能否替换成如下代码?你的结论的依据/理由是什么?
add si, 2
add di, 2
② 在debug中调试,观察数据段中做128位加之前,和,加之后,数据段的值的变化。
不能,add和sub对进位都有影响,替换后进位将无法被处理。
实验任务2
汇编指令代码line11-18,实现的功能是?
判断输入的字符是否为#,如果是的话跳出s1循环
2.
换行
3.
输出长为si的字符串
试验任务3
assume cs:code, ds:data
data segment
x dw 91, 792, 8536, 65521, 2021
len equ $ - x
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax, data
mov ds, ax
mov cx, 5
mov si, offset x
s: mov ax, ds:[si]
call printNumber
call printSpace
inc si
inc si
loop s
mov ah, 4ch
int 21h
printNumber:
mov bx, 0AH ;除数
mov dx, 0 ;高位置为0,记录余数
mov di, 0
push cx
s1: div bx
push dx ;余数入栈
inc di
mov dx, 0
cmp ax, 0 ;被除数为0时结束
je next
jmp s1
next: mov ah, 2
mov cx, di
s2: pop dx
or dl, 30H ;数字转字符
int 21h
loop s2
pop cx
ret
printSpace:
mov dl, ' '
mov ah, 2
int 21h
ret
code ends
end start
试验任务4
data segment
str1 db "assembly language, it's not difficult but tedious"
len equ $ - str1
data ends
stack segment
db 16 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
mov ax,data
mov ds,ax
mov si,offset str1
mov cx,len
call strupr
mov ah,4ch
int 21h
strupr:
s:
mov al,ds:[si]
cmp al,'a'
jb next
cmp al,'z'
ja next
and al,0dfh;1101 1111
mov ds:[si],al
next:
inc si
loop s
ret
code ends
end start
试验任务5
试验任务 6
中断是指CPU不再接着向下执行,而是转去处理这个特殊信息。
CPU接受到中断信息后,可以立即对中断信息进行处理,用来处理中断信息的程序被称为中断处理程序。
软中断是指由软件本身发给操作系统内核的中断信号。
中断过程是先从从中断信息中取得中断类型码,然后令标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中),并设置标志寄存器的第8位TF和第9位IF的值为0。CS的内容入栈,IP的内容入栈。最后从内存地址为中断类型码4和中断类型码4+2的两个子单元中读取中断处理程序的入口地址设置IP和CS。
好文要顶