. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验九!!!  [待解决] 回复[ 2次 ]   点击[ 309次 ]  
liash
[帖 主]   [ 发表时间:2011-08-04 20:37 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-29 21:21
做了一下实验九,用了多种方法
以下是用双层循环做的,虽然代码长了点,但比较实用
assume cs:code,ds:data,ss:stack

data segment
        db 'Welcome to masm!'        
        db 02h,24h,71h,21h,07h
assume cs:code,ds:data
stack segment
        db 16 dup (0)
stack ends

code segment
start:        mov ax,0b800h        
                mov es,ax
                mov ax,data        
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,16
                                                        
                mov cx,5
                mov di,16
                mov si,0                                        ;记录行数
                
        s:        push cx
                mov bx,0                                        ;用于内循环字母递增
                mov cx,16                                        ;记录内循环的次数
                mov bp,0                                        ;确定进来的字母位置
                
                s0:        mov al,[bx]                
                        mov ah,[di]                        ;字体颜色                
                        mov es:[si].9a0h[bp],ax                
        
                        add bp,2                
                        inc bx                
                loop s0
                
                inc di
                add si,0a0h
                pop cx
        loop s
                                
mov ax,4c00h
int 21h
code ends
end start

还有一个比较,不太实用的,若是更改显示的行数的话,比较麻烦。但是用 jcxz,所以试了一下

assume cs:code,ds:data
data segment
        db 'Welcome to masm!' 
data ends

code segment
        start: mov ax,0b800h 
        mov es,ax
        mov ax,data 
        mov ds,ax

        mov bx,0 
        mov si,0 
        mov cx,16 
        s: mov al,ds:[bx] 
        mov ah,02h ;黑底绿色 
        mov es:[si+720h],ax 
        mov al,ds:[bx] 
        mov ah,24h ;绿底红色 
        mov es:[si+7c0h],ax 
        mov al,ds:[bx] 
        mov ah,71h ;白底蓝色 
        mov es:[si+860h],ax 
        add si,2 
        inc bx 

        dec cx ;当cx自减16次后 cx=0 jcxz跳转至 ok
        jcxz ok
        jmp short s

        ok: mov ax,4c00h
        int 21h
code ends
end start 

不过这段代码有些问题,因为是用jczx,所以debug的时候不能用p绕过里面的循环,我用-g 34 直接看结果。
但是一用 -g 34 的话这个窗口就死了,键盘无法输入,只能强制关闭。这个问题纠结了很久都没有答案,求高手帮忙解答啊~~ 小弟先谢过了哈
chinatree
[第1楼]   [ 回复时间:2011-08-04 23:03 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
mov es:[si].9a0h[bp],ax这句是不是mov es:[si+bp+9a0h],ax呀,那你第二个程序直接用Loop s不就好了
liash
[第2楼]   [ 回复时间:2011-08-05 09:38 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-29 21:21
回复:[第1楼]
------------------
是的 就是表现形式不同
有用loop s 写过一个  
然后想用第九课里面的jcxz 试试看行不行
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved