在指定位置输出字符串

               

开始看解答上面的代码一大篇,大惊,再一细看,觉得代码不是很好。王爽把参数的栈传递放置于附录中讲解,也是寥寥数笔尔,看了还觉不是甚爽。回头到王爽fans站里找了个博客,整个博客仅一图片,不过高手就是不同,一切尽在不言中,看罢图片( 函数参数栈传递),大有裨益,回头写下这题代码。hoho~~

; ----------------------------------------------------------------------
; Program :将datasg中的字符串输入到屏幕指定位置 ,并要求设置字符串格式
; Created by :刺猬
; ----------------------------------------------------------------------
assume cs
:codesg , ds :datasg , ss :stacksg

datasg segment
    db 'welcome to masm!'
, 0
datasg ends
stacksg segment
    db 
16  dup  ( 0 )
stacksg ends

codesg segment
    main:    mov ax
, datasg
        mov ds
, ax
        mov ax
, stacksg
        mov ss
, ax
        mov sp
, 16

        mov bp
, sp
        sub sp
, 6              ; 以下三个是局部变量,用堆栈保存 翻译成C语言
        mov word ptr [bp-
6 ] , 2h         ; int cl = 02h
        mov word ptr [bp-
4 ] , 3          ; int dl = 3
        mov word ptr [bp-
2 ] , 8          ; int dh = 8
        push [bp-
2 ]             ; 这里用栈传递三个参数 show_str ( cl , dl , dh )
        push [bp-
4 ]
        push [bp-
6 ]
        
call  show_str
        add sp
, 12
        mov ax
, 4c00h
               int 21h


   show_str:  push bp
           mov bp
, sp
           dec word ptr [bp
+ 8 ]         ;( dh- 1 ) * 160   这里是计算行数
           mov ax
, 160
           mul word ptr [bp
+ 8 ]
           mov [bp
+ 8 ] , ax
           dec word ptr [bp
+ 6 ]         ;( dl- 1 ) * 2       这里是计算列数
           mov ax
, 2
           mul word ptr [bp
+ 6 ]
           mov [bp
+ 6 ] , ax
   
           mov ax
, 0b800H         ; 设置es :b800H
           mov es
, ax
           mov bx
, [bp + 8 ]         ; 设置bx,即是偏移地址
           add bx
, [bp + 6 ]
           mov si
, 0              ; si记录ds中的偏移
           mov di
, 0              ; 自然 di是记录es中的偏移了
   
       s:    mov cl
, ds:[si]    
              mov ch
, 0
           jcxz ok            
; 发现是0,即到了字符串结尾了
           mov es:[bx
+ di] , cx         ; 如果不是结尾那么就拷贝
           mov ax
, [bp + 4 ]
           mov es:[bx
+ di + 1 ] , ax
           add di
, 2
        inc si
    jmp s                    
; 循环

    ok:    pop bp
        ret
                           
    codesg ends
end  main

 网上有大师传言“汇编应该放在C语言之前学习”,吾等天资愚钝,学了c之后再研究汇编同样是亦趋亦步,私下揣摩如若当初以汇编起步,可能到现在还没入门。看来我等平平小辈还是先学习c再回头研究汇编,C语言基础并不复杂,现在细想,除了指针(其实初学者所遇指针也无非是些数组指针相互变化尔,像指针的内存分配只有到数据结构中才有深入认识),学习过程也该是一马平川的,倘若有较好的c基础,估计入门汇编也不会太难,在寻址,子程序这些概念不会太过于陌生,想对于一个没有任何程序经验的入门者来说,要去理解寻址,子程序恐怕有些困难。一家之言,见笑了

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

猜你喜欢

转载自blog.csdn.net/qq_43678612/article/details/86315974