实验10.1
本帖最后由 远山 于 2016-4-27 15:44 编辑assume cs:code,ds:data,ss:stack
data segment
db 'welcome to masm!',0
data ends
stack segment
db 16 dup (0)
stack 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 dx
push si
push di ; 将子程序中用到的寄存器内容保存起来。
mov al,160
mul dh ;8*160寻址到第8行,因为每行160个字节,结果以乘积的形式默认放到ax中。
mov bx,ax ;将乘积转存至bx中。
mov al,2
mul dl ;2*3寻址到该行的第6个字节处,结果以乘积的形式默认放到ax中。
add bx,ax ;将最终定位的地址放到bx中,共后面指令使用。
mov ax,0b800h
mov es,ax ;初始化es寄存器,将段地址b800放入其中。
mov di,0
mov ah,cl ;将原本存储在cl中的字符的属性内容转存到ah中,因为cx在后面要用来与“jcxz”指令搭配使用。
s:mov ch,0
mov cl,ds: ;将第一个字节存到cl中。
jcxz s0 ;判断cx是否为0,为0即表示字符串结束,跳转,否则继续向下执行。
mov es:,cl ;将字符内容放入低地址中。
mov es:,ah ;将字符属性放入高地址中。
inc si ;si+1,定位到下一个字符。
add di,2 ;di+2,定位到显示字符的下两个字节。
jump short s ;跳转。
s0:pop di ;取出寄存器内容,返回。
pop si
pop dx
pop cx
pop bx
pop ax
ret
code ends
end start
不知道为什么,按照上面的程序debug后的字符显示在了第四行第三列,为什么呢,8*160=1280最后寻址应该是第八行啊。
本帖最后由 兰陵月 于 2016-5-5 09:51 编辑
远山 发表于 2016-4-28 15:35
不知道为什么,按照上面的程序debug后的字符显示在了第四行第三列,为什么呢,8*160=1280最后寻址应该是第 ...
1、jump short s ;跳转。
这里错了,是【JMP】。
2、可能由于编译器所在操作系统原因或者版本原因,
mov es:,ah ;将字符属性放入高地址中。
这一句中“”我改为""后编译通过。
3、运行结果
通过了啊!
应该和你实验10.3的问题一样,编译器问题把~ 兰陵月 发表于 2016-5-5 09:48
1、jump short s ;跳转。
这里错了,是【JMP】。
2、可能由于编译器所在操作系统 ...
谢谢谢谢谢谢!{:10_266:} 远山 发表于 2016-5-5 15:06
谢谢谢谢谢谢!
兄弟,有时候一定要相信自己~{:7_113:}{:7_113:}{:7_113:}
页:
[1]