汇编从入门到入土七

  1. 实验十
    1. 打印字符
    2. 进制转换
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

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论

文章标题:汇编从入门到入土七

文章字数:466

本文作者:prontosil

发布时间:2020-04-21, 19:10:08

最后更新:2020-04-25, 17:22:34

原始链接:http://prontosil.com/posts/ce48dac5/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录