8086汇编显示字符串

做了题目也总结一下,如下所示
8086汇编显示字符串_第1张图片

8086汇编显示字符串_第2张图片

8086汇编显示字符串_第3张图片

8086汇编显示字符串_第4张图片

程序如下所示

assume cs:code,ss:stack,ds:data
data segment
    db 'Welcome to masm!',0
data ends

stack segment
        db 48 dup (0)
stack ends

code segment
    start:mov dh,8 ;代表第8行
          mov dl,3 ;代表第3列
          mov cl,2 ;设置cl为2就是绿色字符属性
          mov ax,data ;设置数据段的地址
          mov ds,ax

          mov ax,stack ;设置栈段
          mov ss,ax
          mov sp,48 ;设置sp

          mov si,0 ;设置si
          call show_str ;调用show_str

          mov ax,4c00h ;结束程序
          int 21h

     show_str:push cx
              push dx
              mov bx,0b800h ;设置为显存地址
              mov es,bx     ;移动到扩展段

              mov al,160 ;160个字节一列
              sub dh,1   ;8行开始地址为160*7所以减1
              mul dh      ;乘7
              mov di,ax   ;设置di为ax

              sub dl,1  ;dl减1就为第二列开始处
              mov al,2  ;列中以2个字节为一组数据高地址是字符属性
              mul dl    ;让al乘dl,结果保存在ax中
              add di,ax ;添加列的偏移地址

              mov dh,cl ;存放字符的属性

            s: mov cl,ds:[si] ;给字符数据给cl
               mov ch,0 ;将ch设置为0

               jcxz ok ;如果cx为0了,也就是遇到最后一个字符串了就跳出来了

               mov dl,cl ;将字符数据给dl

               mov es:[di],dx ;设置dx给显存地址区域,dx中包含了字符属性和字符数据

               inc si ;字符数据往后偏移

               add  di,2 ;di加2就是到下一个显存地址处以两个字节为一轮


               loop s ;循环

            ok:pop dx ;dx寄存器出栈也就是保存的8行和3列数据出栈
               pop cx ;cx出栈
               ret
code ends
end start

执行结果
8086汇编显示字符串_第5张图片

你可能感兴趣的:(ios-逆向)