王爽老师汇编语言第四版:实验九 根据材料编程

目录

1.首先是编译问题

2.显示缓存区每一行是80个字符也就是160个字节

3.当数据想要写到第二行时  这时si已经向后走了16个位移了所以不能直接+160

应该+160-32

4.视频中教程用一个寄存器:高位存属性低位存数据(BX)

5.视频中是这样写的


 下面这段代码是看完视频后自己有写了一遍的结果

写的过程中遇到的问题有:

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y6y6y666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值