;实验一显示字符串
assume cs:code,ds:data 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 bx,0b800h //显示区 mov es,bx sub dh, mov al,160 mul dh //行存放在ax中 mov di,ax sub dl,1 mov al,2 mul dl //列的位置 add di,ax //最终的位置放在di中 mov dh,cl //属性存放在dh中,为了ok判断cx是否为0 s: mov cl,ds:[si] mov ch,0 mov dl,cl //低位存放字母 mov es:[di],dx inc si add di,2 jcxz ok loop s ok: ret code ends end start
实验二:除法溢出
;首先要说明的是这个公式的作用,int(H/N)存放最终结果的高位。 ;低位是在用高位除法后的余数左移16位参与低位的运算之中,其 ;低位商存于ax之中,余数复赋值给cx,再把之前高位商赋值给dx ;即可(不知道为什么刚开始没定义stack会RE,stack也会溢出) assume cs:code,ss:stack stack segment dw 16 dup(0) stack ends code segment start: mov ax,4240H mov dx,000FH mov cx,0AH mov bx,stack mov ss,bx mov sp,16 call divdw divdw: push ax mov ax,dx mov dx,0 mov cx,10 div cx mov cx,ax ;高位商 pop ax ;低位数字 push cx ;余数直接就在dx参与下面的运算 mov cx,10 div cx ;ax就是最终商 mov cx,dx ;最终余数 pop dx ret code ends end start
结果正确
实验三:把data段的数据以十进制的形式显示出来
assume cs:code,ds:data data segment dw 123,12666,1,8,3,38 data ends code segment start: mov ax,data mov ds,ax mov si,12 mov cx,6 mov bx,0 transfer_all: mov ax,ds:[bx] call dtoc add bx,2 call next_word loop transfer_all mov si,12 mov dh,8 mov dl,20 mov cx,6 show_all: push cx mov cl,2 call show_str call next_word inc dh pop cx loop show_all mov ax,4c00h int 21h dtoc proc near push bx push dx push cx push ax push si mov bx,0 decimal_change: mov dx,0 mov cx,10 div cx add dx,30h push dx inc bx cmp ax,0 jne decimal_change mov cx,bx transfer: pop dx mov [si],dl inc si loop transfer mov ax,0 mov [si],al pop si pop ax pop cx pop dx pop bx ret dtoc endp next_word proc near push ax zero_or_not: mov ax,[si] mov ah,0 cmp ax,0 je end_of_num inc si jmp zero_or_not end_of_num: inc si pop ax ret next_word endp show_str proc near push ax push es push dx push di push si mov ax,0b800h mov es,ax mov al,0a0h mul dh mov di,ax mov al,2 mul dl add di,ax s: mov ax,ds:[si] mov es:[di],ax inc di mov es:[di],cl inc si push cx mov cx,ds:[si] mov ch,0 jcxz end_show pop cx inc di jmp s end_show: pop cx pop si pop di pop dx pop es pop ax ret show_str endp code ends end start