这里推荐下 我用的实验楼的调试环境 这个课是免费的
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行。