汇编网首页登录博客注册
jizha的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
  •  或许我并不是最好的,但坚信,一直坚持向前走,我肯定可以到达最好的!
  • 『姓名』:jizha
  • 『性别』:男『发送消息
  • 个人说明:;************
    骐骥一跃,不能十步;
    驽马十驾,功在不舍;
    锲而舍之,朽木不折;
    锲而不舍,金石可镂。
  • 详细信息『加为好友』
学习动态
友情链接

[2008-11-29 12:32] 实验8,实验9提交 请求老师指点

实验8:分析一个奇怪的程序
assume cs:codesg
codesg segment
           mov ax,4c00h
          int 21h
start: 
        mov ax,0
s:        nop
        nop
        
        mov di,offset s
        mov si,offset 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
程序可以正常返回,因为jmp short s1这条指令中s1为偏移,并非地址。所以当它被复制到s处时,依据偏移,正好可以跳转并执行
mov ax,4c00h
int 21h
在这里可以看见王爽老师的一片苦心呢!将跳转设置的如此巧妙,再次向王老师致敬!呵呵!

实验9 
编程:在屏幕中间分别显示绿色,绿底红色,白底蓝色的字符串
‘welcome to masm!'
源代码如下:
assume cs:code,ds:data
data segment
        db 'welcome to masm!'
data ends

code segment
start:        mov ax,data
        mov ds,ax
        mov ax,0b800h ;显示缓冲区的基址
        add ax, 078h  ;在第十二行显示
        mov es,ax

        mov cx,16
        mov bx,0
        mov ah,02   ;绿色
        mov bp,0        
s:        mov al,ds:[bx]
        mov es:[bp],ax
        inc bx
        add bp,2
        loop s

        mov ah,00100100b ;绿底红字
        mov bx,0
        mov cx,16
s1:        mov al,ds:[bx]
        mov es:[bp],ax
        inc bx
        add bp,2
        loop s1

        mov ah,01110001b ;白底蓝字
        mov bx,0
        mov cx,16
s2:        mov al,ds:[bx]
        mov es:[bp],ax
        inc bx
        add bp,2
        loop s2

        mov ax,4c00h
        int 21h
code ends
end start
这一次的实验任务算是比较轻松的,只要掌握一下如何控制显示的位置就行了,这个后面可能会用到!

补:
上面的那种方法是比较笨的,偷懒没有使用嵌套循环
下面我不偷懒的添上,呵呵!
源代码如下:
assume cs:code,ds:data
data segment
        db 'welcome to masm!'  ;待显示的字符串
        db 02h,24h,71h               ;显示的颜色设置,分别为绿色、绿底红字、白底蓝字
data ends

stack segment
        db 16 dup (0)
stack ends

code segment
start:
        mov ax,data
        mov ds,ax
        mov ax,0b800h ;显示缓冲区的基址
        add ax, 078h  ;在第十二行显示
        mov es,ax
        mov ax,stack
        mov ss,ax        
        mov sp,16


        mov si,0
        mov cx,3
        mov bp,0   ;控制字符显示的列起始位置
s:        mov ah,ds:16[si]
        mov bx,0
        push cx
        mov cx,16
s1:        mov al,ds:[bx]
        mov es:[bp],ax
        inc bx
        add bp,2
        loop s1
        pop cx
        inc si
        loop s

        mov ax,4c00h
        int 21h

code ends
end start
评论次数(2)  |  浏览次数(425)  |  类型(汇编作业) |  收藏此文  | 

[  crazyman   发表于  2008-11-29 21:06  ]

第一题:博主理解的非常正确,连作者的用心都体会到了。
第二题:程序没有问题,不过,是不是应该分三行显示呢,那样有些定址逻辑稍稍有点变动。
不过,对博主来说那个好像不重要了,已经理解了知识点了。

[  justlikeit_361   发表于  2008-12-01 15:02  ]

恩,第二个分行好些

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码