实验10
第一题,速度不错 1小时弄出来了,未看教程assume cs:codedata 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 ;定义ES是写入段
sub dl,1 ;列数减1
mov al,2 ;因每个显示的字占两个字节,所以要乘2 所以AL=2
mul dl ;乘列数得出列数的地址
mov bx,ax ;将要写入的列地址放入BX保存
mov ah,0 ;ah清0
mov al,dh ;行数给AX,此时AX应是00行数
mov dx,160 ;每行160个字节 此时DX的2个参数已经读过了所有可以覆盖
mul dx ;行数乘160个字节算出要写入的行地址
add bx,ax ;将行数地址和列数地址相加算出实际要写入的地址,放入AX中
mov dh,cl ;将颜色数据放入高地址DH中
s: mov ch,0 ;ch清0
mov cl,byte ptr ds: ;将数据段字符放入Cl中
jcxz s1 ;如果CX=0则跳转到S1结束
mov ch,dh ;将放入DH中的颜色数据拿回来给CL
mov word ptr es:,cx ;将CX的值写入到实际地址中
add si,1
add bx,2
jmp s
s1:
ret
code ends
end start
本帖最后由 许楠 于 2012-1-8 13:22 编辑
气死我了,第二题按书上写的乘65536,在网上找了半天怎么乘65536,即使有也忒啰嗦,要用到ADC什么的,不象是这道题的本意,绞尽脑汁了也没想出来怎么乘,没办法看了视频,原来是这样......
算了,脑袋一团浆糊了 先休息一下 assume cs:code
stack segment
db 8 dup (0)
stack ends
code segment
start:
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
divdw:
mov bx,stack
mov ss,bx
mov sp,8
push ax ;先把AX保存起来
mov ax,dx;将高16位放到低16位里来
mov dx,0 ;高16位清0
div cx ;除CX,除完后DX是余数,AX是商
mov bx,ax ;将AX保存在BX中
pop ax ;取出AX
div cx ;此时DX没动,但DX是高16位,所以相当于乘了65536
mov cx,dx ;将余数给CX
mov dx,bx ;将BX里的值给DX,当作商的高16位,也就相当于乘了65536,AX则是默认的低16位
ret
code ends
end start只能先这样了,没办法啊 不会只能看教程 下面弄第3题 哥们你代码有测试通过么? 顶楼主 都没问题。。第二题我用的8位除法 为啥第二次除完就出错了?{:5_99:}
;X/N=INT(H/N)*10000H+/N
;X=1000000=0F4240H,N=10=0AH
DATAS SEGMENT
DW 4240H,0FH,0AH
DATAS ENDS
STACKS SEGMENT
DW 0
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV SP,0
MOV AX,WORD PTR DS:
MOV DX,WORD PTR DS:
MOV CX,WORD PTR DS:
CALL DIVDW
MOV AH,4CH
INT 21H
DIVDW:
PUSH AX
MOV AX,DX
XOR DX,DX
DIV CL
MOV DL,AL ;INT(H/N)*10000H
POP BX
ADD BL,AH
MOV AX,BX ;
DIV CL
MOV CL,AH
MOV AH,0
CODES ENDS
END START
页:
[1]