在指定位置输出字符串

时间:2023-01-03 09:15:52

开始看解答上面的代码一大篇,大惊,再一细看,觉得代码不是很好。王爽把参数的栈传递放置于附录中讲解,也是寥寥数笔尔,看了还觉不是甚爽。回头到王爽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基础,估计入门汇编也不会太难,在寻址,子程序这些概念不会太过于陌生,想对于一个没有任何程序经验的入门者来说,要去理解寻址,子程序恐怕有些困难。一家之言,见笑了