许楠 发表于 2012-1-8 11:41:06

实验10

第一题,速度不错 1小时弄出来了,未看教程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 ;定义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:00

本帖最后由 许楠 于 2012-1-8 13:22 编辑

气死我了,第二题按书上写的乘65536,在网上找了半天怎么乘65536,即使有也忒啰嗦,要用到ADC什么的,不象是这道题的本意,绞尽脑汁了也没想出来怎么乘,没办法看了视频,原来是这样......
算了,脑袋一团浆糊了 先休息一下

许楠 发表于 2012-1-8 21:33:36

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题

吃货YA鸭 发表于 2017-6-20 10:30:10

哥们你代码有测试通过么?

BellXu 发表于 2017-8-21 00:18:03

顶楼主 都没问题。。第二题我用的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]
查看完整版本: 实验10