|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- 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
-
- sub dl,1 ;第三列相当于在2号位
- add dl,dl ;字符是两个字节组成
- mov bl,dl
- mov bh,0
- mov di,bx ;转化为字节的列数
-
- sub dh,1 ;第8行相当于7号位行
- mov al,dh
- mov ah,0
- mov bx,00a0h ;一行有160个字节
- mul bx ;找到字节位置
- sub ax,1 ;减1得字属性位置
- mov bp,ax
-
- s: mov cx,[si] ;判断字符串末尾
- jcxz offset ok ;cx为零停止
- mov cl,2 ;字符绿色属性
- mov al,[si]
- mov es:[bp+di+1],al ;将字属性放入显存
- mov es:[bp+di+2],cl ;将颜色属性放入字属性后一位
-
- add di,2 ;显存一个字符的单位
- add si,1 ;数据段一个字符单位
-
- jmp short s
- ok: ret ;提取字符串到末尾返回
- code ends
- end start
- 2.
- assume cs:code
- data segment
- dd 0,0
- data ends
- code segment
- start: mov ax,data
- mov ds,ax
-
- mov ax,4240h
- mov dx,000fh
- mov cx,0ah
-
- call divdw
- mov ax,4c00h
- int 21h
-
-
- divdw:mov bx,ax
- mov ax,dx
- mov dx,bx ;互换高低位
- mov si,0
-
- mov [si+4],dx ;将dx = 4240h暂存数据空间 00 00 00 00 42 40 00 00
- div cl ;八位除数
- mov bl,al
- mov bh,0
- mov [si],bx ;将高16位的商存数据空间 01 00 00 00 42 40 00 00
-
- mov dl,ah ;余数存dx用于下一步16位除法 放入高16位相当于*65536
- mov dh,0
-
- mov ax,[si+4] ;将原公式低16被除数放入ax准备运算16除法
- div cx ;运算后得到的ax既为结果低16位的商 86A0
- mov cx,dx ;dx为最终余数
- mov word ptr dx,[si] ;将数据空间内原本存储的高16位的商结合即为 186A0
- ret
- code ends
- end start
- 3.
- assume cs:code
- data segment
- dw 123,12666,1,8,3,38
- data ends
- d segment
- db 5 dup(0) ;d段:开辟五个字节空间暂存字符串每个字符对应的字属性
- d ends
- stack segment
- dw 2 dup(0) ;暂存计数器
- stack ends
- code segment
- start: mov ax,data
- mov ds,ax
-
- mov ax,0b800h ;存显存段地址
- mov es,ax
-
- mov ax,stack
- mov ss,ax
- mov sp,4
-
- mov si,0
- mov di,0
- mov cx,6 ;6个字符运行六次
- s:push cx
- ;避免cx被干扰
- mov bx,0 ;dtoc中 bx作为计数器为short计算位置
- mov bp,0 ;bp为d断寻址偏移
- call dtoc
-
- add si,2 ;dtoc中 si为data段中数值的偏移
- mov bp,0 ;show_str中 bp同样作为对d段暂存字符串字属性的使用
- mov cx,bx ;将dtoc得到的bx计数器作为show_str的循环次数,这样就知道要显示的数值到底是几位数
- call show_str
- pop cx ;归还总体循环次数
- loop s
-
- mov ax,4c00h
- int 21h
-
- dtoc: mov ax,[si]
- mov cx,10
- mov dx,0
- div cx
- mov [si],ax
- add dx,30h ;当前dx为余数,即为数值最后一位的数字 +30h为对应的ascii码
- mov ds:[bp+16],dl ;倒序存入d段
- dec bp
-
- inc bx ;计数器为show_str使用
- mov cx,ax
- jcxz short ok ;字符末尾返回
- jmp short dtoc
-
- ok: ret
-
-
- show_str: mov ax,5 ;d段为五个字节
- sub ax,cx ;减去dtoc得到的计数器就可得知d段中有几个字属性,从哪个字节开始将数据传入显存
- mov bp,ax
- mov al,ds:[bp+12]
- mov ah,2
- mov es:[di+1830],ax ;1830为屏幕显示位置
- add di,2
- loop show_str
- add di,2 ;空格隔开
- ret
- code ends
- end start
-
复制代码 |
|