实验4 8086标志寄存器及中断
实验一
原程序运行结果如下:
运行结束后x,y标号处数据结果如下:
发现x处16字节数据变成了原来的x+y
将inc改为add运行结果如下:
发现在此处2者对程序运行没有影响。
但查阅资料可知:inc对zf造成影响,而add对zf和cf造成影响,也就是add的进位信息会被保留,但inc不会。
实验任务2
运行结果如下:
(1)11~18行功能:
将一个字符输入al,并且保存到ds:[si],即data段里,并且比较al和‘#’,如果相等跳转至next标号执行,不相等则继续输入下一个字符并保存到
data段。
(2)20~22行功能:
查阅资料知,换行ascii码为10,16进制即为000ah,所以功能为输出换行符。
(3)
将ds处,即data段的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 si, offset x mov cx,5 s: mov ax,ds:[si] call PrintNumber call PrintSpace inc si inc si loop s mov ah,4ch int 21h PrintNumber: mov bx,0Ah ;除数10 mov dx,0 ;AX存储除法操作的商,DX存储除法操作的余数, 被除数为32位,被 除数则在(DX和AX)中存放,DX存放高16位,AX存放低16位。 mov di,0 ;di记录位数 push cx ;当前cx进栈 s1: div bx; push dx; inc di mov dx,0 cmp ax,0 je next jmp s1 next: mov cx, di mov ah,2 ;打印相应中断 s2: pop dx or dl,30h int 21h loop s2s pop cx ret PrintSpace: mov ah,2d mov dl, ' ' int 21h ret code ends end start
运行结果如下:
实验任务4
查阅资料,大小写转换方法如下;
or al,00100000B ;将字符的第五位转换成1,转换成小写字母;
and al,11011111B ;将字符的第五位转换成0,转换成大写字母。
代码如下:
assume cs:code,ds:data data segment str db "assembly language, it's not difficult but tedious" len equ $ - str data ends code segment start: mov ax,data mov ds,ax mov cx,len mov si,offset str f: call strupr loop f mov ah,4ch int 21h strupr: mov al,ds:[si] cmp al,'a' jb print ;小于 cmp al,'z' ja print ;大于 mov ah,2 and al,11011111B mov dl,al int 21h inc si ret print: mov ah,2 mov dl,al int 21h inc si ret code ends end start
运行结果如下:
实验任务5
assume cs:code, ds:data data segment str1 db "yes", '$' str2 db "no", '$' data ends code segment start: mov ax, data mov ds, ax mov ah, 1 int 21h mov ah, 2 mov bh, 0 mov dh, 24 mov dl, 70 int 10h cmp al, '7' je s1 mov ah, 9 mov dx, offset str2 int 21h jmp over s1: mov ah, 9 mov dx, offset str1 int 21h over: mov ah, 4ch int 21h code ends end start
运行结果如下:
程序功能:
从键盘输入一个字符,如果为7,则在指定位置输出yes,否则输出no
实验任务6
assume cs:code code segment start: ; 42 interrupt routine install code mov ax, cs mov ds, ax mov si, offset int42 ; set ds:si mov ax, 0 mov es, ax mov di, 200h ; set es:di mov cx, offset int42_end - offset int42 cld rep movsb ; set IVT(Interrupt Vector Table) mov ax, 0 mov es, ax mov word ptr es:[42*4], 200h mov word ptr es:[42*4+2], 0 mov ah, 4ch int 21h int42: jmp short int42_start str db "welcome to 2049!" len equ $ - str ; display string "welcome to 2049!" int42_start: mov ax, cs mov ds, ax mov si, 202h mov ax, 0b800h mov es, ax mov di, 24*160 + 32*2 mov cx, len s: mov al, [si] mov es:[di], al mov byte ptr es:[di+1], 2 inc si add di, 2 loop s iret int42_end: nop code ends end start
assume cs:code code segment start: int 42 mov ah, 4ch int 21h code ends end start
运行结果如下:
软中断是通过执行中断指令产生的,是软件层面对进程的中断,汇编语言的软中断可以理解为高级语言中函数的调用。上述例子中对中断号的自定义可以灵活地执行编程需要的操作。