主题:这段程序有地方看不懂,谁指点一下
初学汇编,抱着王爽《汇编语言》在看。在实验10编写一个显示字符串的子程序。看了答案,有些地方不明白,特来请教。
完整程序如下:
********************************
1 assume cs:code,ds:data
2 data segment
3 db 'Welcome to masm!',0
4 data ends
5 code segment
6 start:
7 mov dh,8 ;dh装行号(范围:1--25)
8 mov dl,12 ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]
9 mov cl,0cah ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
10 mov ax,data
11 mov ds,ax
12 mov si,0
13
14 call show_str
15
16 mov ax,4c00h
17 int 21h
18
19 show_str: ;显示字符串的子程序[定义开始]
20 push cx
21 push si
22 mov al,0a0h
23 dec dh ;行号在显存中下标从0开始,所以减1
24 mul dh
25 mov bx,ax
26 mov al,2
27 mul dl
28 sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
29 add bx,ax ;此时bx中存放的是行与列号的偏移地址
30 mov ax,0b800h
31 mov es,ax ;es中存放的是显存的第0页(共0--7页)的起始的段地址
32 mov di,0
33 mov al,cl
34 mov ch,0
35 s:
36 mov cl,ds:[si]
37 jcxz ok
38 mov es:[bx+di],cl ;偶地址存放字符
39 mov es:[bx+di+1],al ;奇地址存放字符的颜色属性
40 inc si
41 add di,2
42 jmp short s
43
44 ok:
45 pop si
46 pop cx
47 ret ;显示字符串的子程序[定义结束]
48
49
50 code ends
51 end start
*************************
(特意加了行号)
24行和27行做乘法是什么意思?
还有乘出的结果我也搞不清楚怎么回事。
我在跟踪的时候在(24)mul dh 指令前 (ax)=13A0H (dx)=070CH 按照乘法规则这条指令应该是:(dh)*(ah)=7h*13h=85h,可是指令执行后(ax)=0460H
不明白
完整程序如下:
********************************
1 assume cs:code,ds:data
2 data segment
3 db 'Welcome to masm!',0
4 data ends
5 code segment
6 start:
7 mov dh,8 ;dh装行号(范围:1--25)
8 mov dl,12 ;dl装列号(范围:1--80)[注:每超过80等于行号自动加1]
9 mov cl,0cah ;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
10 mov ax,data
11 mov ds,ax
12 mov si,0
13
14 call show_str
15
16 mov ax,4c00h
17 int 21h
18
19 show_str: ;显示字符串的子程序[定义开始]
20 push cx
21 push si
22 mov al,0a0h
23 dec dh ;行号在显存中下标从0开始,所以减1
24 mul dh
25 mov bx,ax
26 mov al,2
27 mul dl
28 sub ax,2 ;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
29 add bx,ax ;此时bx中存放的是行与列号的偏移地址
30 mov ax,0b800h
31 mov es,ax ;es中存放的是显存的第0页(共0--7页)的起始的段地址
32 mov di,0
33 mov al,cl
34 mov ch,0
35 s:
36 mov cl,ds:[si]
37 jcxz ok
38 mov es:[bx+di],cl ;偶地址存放字符
39 mov es:[bx+di+1],al ;奇地址存放字符的颜色属性
40 inc si
41 add di,2
42 jmp short s
43
44 ok:
45 pop si
46 pop cx
47 ret ;显示字符串的子程序[定义结束]
48
49
50 code ends
51 end start
*************************
(特意加了行号)
24行和27行做乘法是什么意思?
还有乘出的结果我也搞不清楚怎么回事。
我在跟踪的时候在(24)mul dh 指令前 (ax)=13A0H (dx)=070CH 按照乘法规则这条指令应该是:(dh)*(ah)=7h*13h=85h,可是指令执行后(ax)=0460H
不明白