王爽汇编 (八 九 十)实验

这里推荐下 我用的实验楼的调试环境 这个课是免费的
https://www.shiyanlou.com/courses/83

9.1检测点

assume cs:code
data segment
        dd 12345678H
data ends
code segment
        start:
                mov ax,data
                mov bx,0
                mov word ptr  [bx],0
                mov word ptr [bx + 2],code
                jmp dword ptr ds:[0]
code ends
        end start		

在这里插入图片描述
注意:由于是小端存储第一个字 是跳转的ip 第二个字是跳转的段地址。

检测点9.2

assume cs:code
code segment
start:
	mov ax,2000H
	mov ds,ax
	mov bx,0
	s:
	mov cl,[bx]
	mov ch,0
	inc bx
	jcxz ok
	jmp short s
	ok:
	mov bx,dx
	mov ax,4c00h
	int 21h
code ends
end start	

和jmp 类似 但是是 是有条件跳转 jcxz 跳转必须满足if cx == 0
属于短转移指令 只能 修 改 ip 范围 -128 ~127

检测点 9.3

loop 条件跳转 属于短转移指令 范围-128 ~ 127
每次loop 后 cx-1 跳转到标号处 直到cx为0

补全编程,利用loop指令,实现内存2000H段中查找第一个值为0的字节,找到后,将它的偏移地址存储在dx中。

assume cs:code
code segment
	start:
	mov ax,2000H
	mov ds,ax
	mov bx,0
	s:
	mov cl,[bx]
	mov ch,0
	____ ->inc cx
	inc bx
	loop s
	ok:
	dec bx
	mov dx,bx
	mov ax,4c00h
	int 21h
code ends
end start	

loop s 时 cx=cx-1 要使 cx=0 那么 cx - 1 =0 所以cx =1 所以要加 inc cx。

实验八

assume cs:codesg
codesg segment
	mov ax,4c00h
	int 21h
start: mov ax,0
s:	nop
	nop
	mov di,offset s
	mov si,offser s2
	mov ax,cs:[si]
	mov cs:[di],ax
s0:jmp short s
s1:	mov ax,0
	int 21h
	mov ax,0
s2:jmp short s1
	nop
codesg ends
end start				

在这里插入图片描述
mov ax,cs:[si]
在这里插入图片描述
mov cs:[di],ax
在这里插入图片描述
同样是 EB F6 一个JMP 0000 另一个却指向 0018 E8 就是jmp指令 F6 指的是 -10意思是算上本指令向上数10字节处
在这里插入图片描述
最后ip指向了0000处 就执行
mov ax,4c00h
int 21h
程序就结束了

实验九

在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串 ‘welcome to masm!’

assume cs:codesg ds:datasg ss:stacksg
datasg segment
db 'welcome to masm!';这里可以修改 不需要修改其他地方
db 0 ;判断结尾不能修改
datasg ends
stacksg segment
dw '0','0','0','0','0','0','0','0'
stacksg ends
codesg segment
start:
        mov ax,datasg
        mov ds,ax
        mov ax,stacksg
        mov ss,ax
        mov sp,10h 
        mov si,0
        mov ax,0b800h
        mov es,ax
        mov dx,12
        mov ax,71H ;字符串白底蓝色
        push ax
        mov ax,42H ;字符串绿底红色
        push ax
        mov ax,02H ;字符串黑底绿色
        push ax
        mov cx,3;循环3次
     s0:
        mov ax,0a0h ;第一行
        push dx;用dx做乘法后 dx 会被置0 所以压栈保存下
        mul dx ; 一行160个字节 那么只要乘以 行数 再加上列数 就可以算出偏移了
        mov si,ax
        pop dx
        mov ax,40 ;第四十列
        add si,ax
        mov bx,0
        pop ax
        push cx
     s1:;循环单字节写入
        mov cl,[bx]
        mov ch,0
        add cx,1
        mov ah,[bx]
        mov es:[si + 0],ah
        mov es:[si + 1],al
        add si,2
        inc bx
     loop s1
        pop cx
        inc dx
     loop s0
        mov ax,4c00h
        int 21h
codesg ends
end start

在这里插入图片描述
如上 成功在屏幕上打印出了3行。

发布了85 篇原创文章 · 获赞 5 · 访问量 4715

猜你喜欢

转载自blog.csdn.net/weixin_41315492/article/details/104220918