回 帖 发 新 帖 刷新版面

主题:这段程序有地方看不懂,谁指点一下

初学汇编,抱着王爽《汇编语言》在看。在实验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
不明白

回复列表 (共3个回复)

沙发

做乘法偶也不知道啥子意思,但是乘法是dh*al,不是dl*ah

板凳

.................0  24行的乘法,把bx指向7行之首,下一个乘法,把bx指向了b列
.................1  屏幕一行80个字符,160个字节,所以24行给al赋值0a0h,即
.................2  160d
.................3
.................4
.................5
.................6
.................7
0123456789abcdef

3 楼

谢谢大侠!
我搞明白了,做乘法是为了取得m行n列首个字符在显存中的偏移地址。
另外,乘法规则我看的这本书上写错了,经查,有人纠正过书上的这个错误

我来回复

您尚未登录,请登录后再回复。点此登录或注册