Memory 组件中的回路:8086上的TASM(DosBox)
我正在尝试循环这段代码,它将字符“Q”写入视频内存段b800中的一个地址,该地址由es:[di]指定 在这里,我尝试将循环增加2(因为每个屏幕位置都由两个字节、颜色和属性组成),但代码只在第一个位置生成字符。我想我不明白如何使用cx,因为我认为它应该循环100次Memory 组件中的回路:8086上的TASM(DosBox),memory,video,x86-16,tasm,Memory,Video,X86 16,Tasm,我正在尝试循环这段代码,它将字符“Q”写入视频内存段b800中的一个地址,该地址由es:[di]指定 在这里,我尝试将循环增加2(因为每个屏幕位置都由两个字节、颜色和属性组成),但代码只在第一个位置生成字符。我想我不明白如何使用cx,因为我认为它应该循环100次 .model small .stack .code main: sub cx, cx mov cx, 100 dates: mov ax,0B800h mov es,ax sub
.model small
.stack
.code
main:
sub cx, cx
mov cx, 100
dates:
mov ax,0B800h
mov es,ax
sub di, di
mov di, 200
add di, 2
mov ah, 5
mov al, 'Q'
mov es:[di], ax
loop dates
mov ax,4C00h
int 21h
end main
天哪,很久没有做汇编编程了,但是有一些明显的错误:
- 初始的
将cx设置为0,但这是无用的,因为下一行是sub-cx,cx
mov-cx,100
- 您为每个循环周期设置新的
es
等值,以便所有迭代都写入相同的位置。解决方案:移动日期:在添加di之前添加标签,2di
- 你没有一个合适的循环计数器,所以你应该用类似的东西来替换
循环日期
jnz约会谢谢,这很有道理。我没有组装经验,所以这真的很有帮助。如果循环需要这样一个计数器,那么循环指令有什么用呢?好吧,好吧,祝你玩得开心:-)让我想起了这样的错误杀死整个机器的日子。但同样,当个人电脑有一个真正的复位按钮,MS-DOS从软盘启动的速度比现在的Windows从固态磁盘启动的速度要快;-)我很高兴当时没有参加比赛,但我非常尊重那些参加比赛的人。关于你的第一句话:你是对的,“循环约会”会很好。很抱歉在这里添加了混淆,只是忘记了“loop”是一条有效的8086指令。。。