目录
3.当数据想要写到第二行时 这时si已经向后走了16个位移了所以不能直接+160
下面这段代码是看完视频后自己有写了一遍的结果
写的过程中遇到的问题有:
1.首先是编译问题
前边的知识
并不是所有的寄存器都可以写到[...]里进行寻址的
可以写的有:
bx,bp,di,si
刚开始用寄存器用的不对会有提示但是看不太懂去浏览器搜了又去翻了之前的课本才找到
在课本的第八章一开始就有说明(161)
2.显示缓存区每一行是80个字符也就是160个字节
第一行是0~159
但是159放的是第158个字节的属性
第一行最后一个地址是158
根据以上推理按说是没有问题的
但是当我在dosbox中验证时却发现不对
如图用e指令修改b800:158处的地址为65(A所对应的ascll码)
但是却在第三行蹦出来一个e
这是为什么呢
后来发现就连我改内容前边的偏移地址都不对
每一行有8个字节 偏移地址应该+8才对呀但是为什么一会加8一会加2呢
后来想到了16进制
在dosbox中数据默认都是16进制的而我输入的158是十进制所以不对
包括65 十六进制的65对应的是e
还有偏移地址也是这样的
当我将158转成十六进制时9e
修改数据为41时右上角出现了A
根据视频中提示中间写的内容的偏移地址是在
注意在代码中默认是10进制
0b800h:160*10+30*2
3.当数据想要写到第二行时 这时si已经向后走了16个位移了所以不能直接+160
应该+160-32
因为16个字节还要配16个属性应该是32
4.视频中教程用一个寄存器:高位存属性低位存数据(BX)
数据都是在偶数中的属性都是基数
assume cs:code,ds:data,ss:stack
data segment
;0123456789abcdef
db 'welcome to masm!' ;ds:[si]
db 10001010b;绿色闪烁高亮 ;ds:[di]
db 10101100b;绿底红色
db 11111001b
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
;用bx做中间容器存储属性和内容
mov bx,0
mov di,16
mov si,0
;用es:bp表示要写入的地址
mov ax,0b800h
mov es,ax
mov bp,160*10+30*2
mov cx,3
duohang: push cx
mov cx,16
mov bh,ds:[di]
hang:
mov bl,ds:[si]
;写到这里(一行)
mov es:[bp],bx
add bp,2
inc si
loop hang
mov si,0
pop cx
add bp,160-32
inc di
loop duohang
mov ax,4C00h
int 21h
code ends
end start
5.视频中是这样写的
他是先将要改动的数据push保存起来进行保护
然后第二行循环的时候再拿出来
这种显然更好但是我没想出来
assume cs:code,ds:data,ss:stack
data segment
;0123456789abcdef
db 'welcome to masm!' ; ds:[si]
db 00000010b ;0000 0000 ds:[bx]
db 00100100b ; rgb rgb
db 01110001b
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,128
mov bx,data
mov ds,bx
mov bx,0b800h
mov es,bx
mov si,0
mov di,160*10+30*2
mov bx,16
mov dx,0
mov cx,3
showtRow:
push cx
push si
push di
mov cx,16
mov dh,ds:[bx]
showRow: mov dl,ds:[si]
mov es:[di],dx
add di,2
inc si
loop showRow
pop di
pop si
pop cx
add di,160
inc bx
loop showtRow
mov ax,4C00h
int 21h
code ends
end start