. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验十 第一题  [待解决] 回复[ 2次 ]   点击[ 294次 ]  
asongsky
[帖 主]   [ 发表时间:2009-07-29 22:20 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-10 14:13
assume cs:code
data segment
db 'Welcome to masm!',0
data 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:mov ax,0b800h
mov es,ax
mov ax,0a0h                           :计算位置,8位乘法
mul dh
add al,dl
mov bx,ax
mov al,cl
mov ch,0
s:mov cl,[si]
jcxz ok
mov es:[bx],cl
mov es:[bx+1],al
add bx,2
inc si,1
jmp s
ok:ret
code ends
end start
这段程序显示位置正确,可是显示的是乱码


assume cs:code
data segment
db 'Welcome to masm!',0
data 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:mov ax,0b800h
mov es,ax
mov ax,0a0h                         计算位置,16位乘法
mov bl,dh
mov bh,0
mul bx
add al,dl
mov bx,ax
mov al,cl
mov ch,0
s:mov cl,[si]
jcxz ok
mov es:[bx],cl
mov es:[bx+1],al
add bx,2
inc si,1
jmp s
ok:ret
code ends
end start
而这段程序可以正确显示,行数正确而列数不正确(这段程序用的16位乘法,覆盖了DL中的数据),两段程序在输入字母及颜色时并没不同,不同之处只是在计算显示的位置,想不通为什么(仅仅是计算位置时的不同,按说不应该导致一个可以正确输入字符颜色,而另一个不能)
另外还有个乘法的问题
-r
AX=0000  BX=A000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AF0  ES=0AF0  SS=0AF0  CS=1000  IP=0000   NV UP EI PL NZ NA PO NC
1000:0000 B408          MOV     AH,08
-t

AX=0800  BX=A000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AF0  ES=0AF0  SS=0AF0  CS=1000  IP=0002   NV UP EI PL NZ NA PO NC
1000:0002 B7A0          MOV     BH,A0
-t

AX=0800  BX=A000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AF0  ES=0AF0  SS=0AF0  CS=1000  IP=0004   NV UP EI PL NZ NA PO NC
1000:0004 F6E7          MUL     BH
-t

AX=0000  BX=A000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AF0  ES=0AF0  SS=0AF0  CS=1000  IP=0006   NV UP EI PL NZ NA PO NC
1000:0006 0000          ADD     [BX+SI],AL                         DS:A000=00
最终ax=0000,很是想不通,用的明明是8位乘法,望高手解惑
asongsky
[第1楼]   [ 回复时间:2009-07-30 01:54 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-10 14:13
乘法的问题解决了,书上写的是8位乘法时一个数存放在ah中,实验的结果却是存放在al中的,果然不能尽信书
asongsky
[第2楼]   [ 回复时间:2009-07-30 02:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-07-10 14:13
解决问题了,忽略了显存中偶数字节存放字符,奇数字节存放颜色代码的问题,寻找位置时只加了一次dl,实际上将字符与颜色的位置放错了,并且是在第二列开始显示的
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved