Raye's Journey

汇编从入门到入土七

sub al,al ZF=1,PF=1,SF
mov al,1  ZF=0,PF=0,SF
push ax
pop bx
add al,bl 
add al,10
mul al

实验十

打印字符

这里的重点是不知道字符串的长度,但是知道字符串十以0结尾的,所以利用 cx = 0 jcxz 会跳转,不断地置ch=0,当取到的字符cl=0时即可跳转

assume cs:code

data segment
    db 'Welcome to masm!', 0
data ends

code segment

start:
    mov dh,8 ;dh表示行号
    mov dl,3 ;dl表示列号
    mov cl,2 ;cl表示颜色
    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 di,0
    mov ax, 160
    mul dh
    add di,ax 

    mov al,2
    mul dl
    add di,ax ;计算开始的位置

    mov bl,cl ;保存颜色,因为cx要用来计数

s:
    mov cl, ds:[si] ;取出字符
    mov ch,0 ;当cl=0的时候,cx也等于0,此时执行jcxz
    jcxz ok
    mov es:[di], cl
    mov es:[di+1], bl
    add di,2
    inc si
    loop s
ok: ret

code ends
end start

进制转换

assume cs:code

data segment
    db 10 dup(0)
data ends

code segment

start:
    mov ax,12666
    mov bx,data
    mov ds,bx

    mov si,0

    call dtoc
    mov dh,8
    mov dl,3
    mov cl,2
    call show_str

    mov ax,4c00h
    int 21h
dtoc: mov si,9        
   s0: mov cx,10
       mov dx,00 ;dx存放余数
       div cx
       add dx,30H       
       mov [si],dl

       mov cx,ax ;判断商是否为0
       jcxz rt        

       dec si
       inc cx  ;防止cx=1的时候意外退出循环
       loop s0
rt: ret

show_str:

    mov ax,0b800h
    mov es,ax ;显存段

    mov di,0
    mov ax, 160
    mul dh
    add di,ax 

    mov al,2
    mul dl
    add di,ax ;计算开始的位置

    mov bl,cl ;保存颜色,因为cx要用来计数

s:
    mov cl, ds:[si] ;取出字符
    mov ch,0 ;当cl=0的时候,cx也等于0,此时执行jcxz
    jcxz ok
    mov es:[di], cl
    mov es:[di+1], bl
    add di,2
    inc si
    loop s
ok: ret

code ends
end start

>  cd ..