| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 525 人关注过本帖
标题:大家帮忙看看《汇编语言》里的实践九我做的答案如何
只看楼主 加入收藏
zimmerk
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-5-26
收藏
 问题点数:0 回复次数:8 
大家帮忙看看《汇编语言》里的实践九我做的答案如何
代码有点长,写这么长的代码稍不注意就相当于天灾啊。
代码可以编译通过及正常运行,逻辑上应该没有错。想请大家帮忙看看编码是否标准,风格怎么样,有没有能改进的地方。
新人第一次发贴,还是在这个时候……大家给点面子……

程序代码:
assume cs:code_sg, ds:data_sg, ss:stack_sg

data_sg segment
    ; BL R G B I R G B
    db 00000010b, 00100100b, 01110001b  ; 显示配置
    db 'Welcome to masm!', 0    ; 要显示的字符串
data_sg ends

stack_sg segment
    dw 0, 0, 0, 0, 0, 0, 0, 0
    dw 0, 0, 0, 0, 0, 0, 0, 0
stack_sg ends

code_sg segment
__start:
    ; 初始化段寄存器
    mov ax, data_sg
    mov ds, ax
    mov ax, stack_sg
    mov ss, ax
    mov sp, 32

    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字串长度 ss:[30]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串列输出位置 ss:[28]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串行输出位置 ss:[26]
    ; 计算字串长度
    mov bx, 3
    push bx ; 保存bx原来的值
    xor cx, cx
__travelsal_string_char:    ; 遍历字符串中的每个字符
    mov cl, [bx]
    jcxz __travelsal_string_char_end    ; 遇到中止符结束
    inc bx
    jmp __travelsal_string_char
__travelsal_string_char_end:
    mov ss:[30], bx ; 将结果保存
    pop bx  ; 恢复bx
    sub ss:[30], bx ; 得到字串真正长度

    ; 计算输出位置
    push bx
    ; 计算列位置
    mov ax, 80
    mov bx, ss:[30]
    sub ax, bx
    mov bx, 2
    div bl
    xor ah, ah
    mov ss:[28], ax ; 保存结果
    ; 计算行位置
    mov al, 3
    mov bl, 11
    mul bl
    mov ss:[26], ax
    pop bx
   

    mov ax, 0b800h
    add ax, ss:[26]
    mov es, ax

    ; 遍历显示配置
    mov cx, 3
__get_display_settings:
    mov bx, cx
    mov ah, [bx - 1]    ; 奇(高)地址存放字符的颜色属性
    ; 遍历字串每个字符并输出
    push cx ; 保存cx
    mov cx, ss:[30] ; 取得字串长度
    mov si, ss:[28] ; 取得输出位置
    mov bx, 3
__display_string_next_char:
    mov al, [bx]
    mov es:[si], ax
    add si, 2
    inc bx
    loop __display_string_next_char
__get_string_char_end:  ; 字串中止
    push ax
    mov ax, es
    add ax, 0ah
    mov es, ax
    pop ax
    pop cx  ; 恢复cx
    loop __get_display_settings
    ; 延时
    mov cx, 0ffffh
__sleep1:
    push cx
    mov cx, 0ah
__sleep2:
    nop
    nop
    nop
    nop
    loop __sleep2
    pop cx
    loop __sleep1
    mov ax, 4c00h
    int 21h
code_sg ends

end __start

搜索更多相关主题的帖子: 怎么样 如何 风格 
2012-05-26 03:56
zimmerk
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-5-26
收藏
得分:0 
晕,怎么加分啊
2012-05-26 03:57
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 楼主 zimmerk
同求 期待大牛给你建议。

梅尚程荀
马谭杨奚







                                                       
2012-05-26 09:39
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
__start:

一般这种下划线风格是系统或某些库才用的

    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字串长度 ss:[30]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串列输出位置 ss:[28]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串行输出位置 ss:[26]

能给我讲讲为啥这么写么 可读性? 写成一个注释的好一样有可读性

下面帖一段linux内核编程风格里的话

注释是一件很好的事情, 但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好: 你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.

  通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的. 而且,要试图避免将注释插在一个函数体里: 假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看. 你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分, 但是你必须要避免过多. 取而代之的是, 将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.


对照这个思考一下上面的代码

代码风格 或者说你说的编码 不是天上掉下来的 是 学习 实践 交流 思考 得来的 这中间思考很重要

简单说一点希望有帮助

敢于帖代码非常好 祝楼主学习顺利



2012-05-26 13:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
stack_sg segment
    dw 0, 0, 0, 0, 0, 0, 0, 0
    dw 0, 0, 0, 0, 0, 0, 0, 0
stack_sg ends

有个伪指令就dup 你看看书再想想这段代码

还有 程序里面的30 28 这样的东东 应该尽量写成宏 也就是 M equ 30 里面用M (M-2) 这样的东西代替 好处是如果以后要改成50 60一下子就改好了

我没仔细看 编程风格这个东西 没有固定的 但有一些指导性的东西是需要遵守的 上面的点出来的就是明显不和规范的 希望你琢磨琢磨

当然我说的也不全对 你可以看看相关的资料 很多C语言的编程规范对于其他语言有很好的指导作用
2012-05-26 13:35
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
Z版说的很好啊 受教了。

梅尚程荀
马谭杨奚







                                                       
2012-05-26 14:28
zimmerk
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-5-26
收藏
得分:0 
回复 4楼 zklhp
谢谢,以后我会注意标签不加底划线了,原本是为了增加可读性的,不要看起来太乱,以后我会注意的

    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字串长度 ss:[30]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串列输出位置 ss:[28]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串行输出位置 ss:[26]

这个是我看《WIN32汇编》里看到的,说是在栈上分配内存,我觉得应该不错,在以后实现子程序的时候这样做在栈上分配内存给临时变量(也就是高级语言里的局部变量),不知道这样做是否不妥?(我觉得的话如果子程序也就是函数中的变量都在数据段中定义维护会不会很麻烦,所以想到了这种方法)
注释确实很头疼,上次写段代码,开始写的时候思路很清晰,然后去喝口水回来就忘记前面写的是为什么了,呵呵。我以后会注意的
2012-05-27 10:22
zimmerk
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-5-26
收藏
得分:0 
回复 5楼 zklhp
我现在在看王爽写的《汇编语言》,还没说到宏定义,我会去了解一下的。


谢谢大牛给的建议,我回去好好再学习一下。
2012-05-27 10:26
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用zimmerk在2012-5-27 10:22:58的发言:

谢谢,以后我会注意标签不加底划线了,原本是为了增加可读性的,不要看起来太乱,以后我会注意的

    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字串长度 ss:[30]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串列输出位置 ss:[28]
    sub sp, 2   ; 栈中申请一个字单元作临时变量,存放字符串行输出位置 ss:[26]
这个是我看《WIN32汇编》里看到的,说是在栈上分配内存,我觉得应该不错,在以后实现子程序的时候这样做在栈上分配内存给临时变量(也就是高级语言里的局部变量),不知道这样做是否不妥?(我觉得的话如果子程序也就是函数中的变量都在数据段中定义维护会不会很麻烦,所以想到了这种方法)
注释确实很头疼,上次写段代码,开始写的时候思路很清晰,然后去喝口水回来就忘记前面写的是为什么了,呵呵。我以后会注意的

栈上分配可以 但同样代码写三遍就无聊了 而且注释啰嗦。。
2012-05-27 11:35
快速回复:大家帮忙看看《汇编语言》里的实践九我做的答案如何
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029223 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved