. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验10_1,求找茬  [待解决] 回复[ 2次 ]   点击[ 559次 ]  
lonelyhover
[帖 主]   [ 发表时间:2013-05-21 15:26 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29
assume cs:code
data segment
    db 'welcome to masm!',0
data ends

code segment
start:
    mov dh,8        
    mov dl,3
    mov cl,2
    mov ax,data
    mov ds,ax
    mov si,0
    call show_str

    mov ax,4c00h
    int 21h

show_str:
    push ax
    push bx
    push cx
    push si
    push es        ;保护现场
    mov ax,0b800h                                        ;mov al,0ah
    mov es,ax        ;定位显存                        ;mul dh
    mov al,0a0h                                        ;add ax,0b800h
    mul dh                                                ;mov es,ax
    mov bx,ax        ;设置行号                        ;mov al,2h
    mov al,2h                                        ;mul dl
    mul dl                ;设置列号                        ;mov bx,ax
    add bx,ax        ;设置显示位置基址                ;减少一行指令,节省3字节空间,重定位显示位置需要重新修改段寄存器
    mov al,cl        ;设置字体属性

show:
    mov cl,[si]
    mov ch,0h
    jcxz ok                ;判定字符串结尾
    mov es:[bx][si],cl
    inc si                ;显示字符
    mov es:[bx][si],al
    inc bx                ;设置字体属性
    jmp show

ok: 
    pop es
    pop si
    pop cx
    pop bx
    pop ax                ;恢复现场
    ret                ;返回

code ends
end start
lonelyhover
[第1楼]   [ 回复时间:2013-05-23 13:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-18 20:29
补充修改:
show:        ;输出字符
        mov cl,[si]
        mov ch,0h
        jcxz show_str_ok        ;判定字符串结尾
        mov es:[bx],cl
        inc bx        ;显示字符
        inc si        ;指向下一字符
        mov es:[bx],al
        inc bx        ;设置字体属性
        jmp show        
ok:      .
         .
         .
         .
hky987654321
[第2楼]   [ 回复时间:2013-08-12 22:52 ]   [引用]   [回复]   [ top ] 
荣誉值:26
信誉值:0
注册日期:2013-07-15 09:25
找茬!
1、es作为段地址,好像也改不了它,ax传递data段地址任务早已完成,都不必拘泥于书本入栈,这节省四条代码。

2、用mov es:[bx],cl和mov es:[bx],al这种零碎方式来写入字符,显得“格局太小”。直接在循环体外mov ah,cl一次搞定属性字节传递,循环体内mov al,[si]接收字母,以ax这种整体字符来写入,方显大气。

3、在最终的“补充修改”版中,没有找到jcxz show_str_ok的出口标号——show_str_ok。

4、还是最终的“补充修改”版中,“格局太小”毛病产生的错误代码inc bx没改过来,它应是add bx,2。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved