图解在8086模拟器中运行汇编helloworld程序

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bcbobo21cn/article/details/51605858

汇编helloworld代码:

org 100h

; set video mode    
mov ax, 3     ; text mode 80x25, 16 colors, 8 pages (ah=0, al=3)
int 10h       ; do it!

; cancel blinking and enable all 16 colors:
mov ax, 1003h
mov bx, 0
int 10h
     
; set segment register:
mov     ax, 0b800h
mov     ds, ax

; print "hello world"
; first byte is ascii code, second byte is color code.

mov [02h], 'H'    
mov [04h], 'e'   
mov [06h], 'l'  
mov [08h], 'l'  
mov [0ah], 'o'  
mov [0ch], ','  
mov [0eh], 'W'    
mov [10h], 'o'   
mov [12h], 'r'   
mov [14h], 'l'   
mov [16h], 'd'    
mov [18h], '!'      

; wait for any key press:
mov ah, 0
int 16h

ret


启动仿真;程序起始地址是0700:0100;



设置显示模式;

AH=00H
AH=00/INT 10H 是用来设定显示模式的服务程序,AL 寄存器表示欲设定的模式:

AL 文字/图形 分辨率 颜色
00 文字 40*252
01 文字 40*2516
02 文字 80*252
03 文字 80*2516
04 图形 320*2002
05 图形 320*2004
06 图形 640*2002


此处设置为文字、80*25、16色;

看下图;执行int 10h指令时跳到int 10h的中断服务程序处,F4190、F4191;执行完后返回;



看上图,同时栈会发生变化;因为;

CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下:

1)取中断类型码n;

2)标志寄存器入栈,IF=0,TF=0;

3)CS、IP入栈

4)(IP)=(n*4),(CS)=(n*4+2)

从此处转去执行n号中断的中断处理程序。

    有标志寄存器,cs,ip的入栈动作;


cancel blinking and enable all 16 colors;


设置数据段为b800h;



把048h放入b.[00002h],此处是直接写显存;然后H显示出来;


显存
从 0B800H:0000H 开始,就是显示器的存储空间,这就是显存。
在 DOS 流行的时候,屏幕的显示,基本上都是文本模式。
在文本模式下,屏幕上共有 25 行、80 列,可显示 2000 个字符。
当对 0B800H:0000H 开始的内存空间写入数据的时候,字符将立即在屏幕上显示出来,这就是直接写屏。
要在屏幕上显示一个字符,需要连续写入两个字节,第一字节就是字符的 ASCII 码,第二字节是显示属性字节。
那么,要想写入一满屏的字符,就需要连续写入 4000 字节。这个数字就是“显存”的大小。



后面的类同;




显示完毕;

显存似乎没有仿真出来;看不到显存中的内容;


int 16h,键盘中断;

功能号:00H和10H
功能:从键盘读入字符 
入口参数:AH
          =00H—读键盘 
          =10H—读扩展键盘,可根据0000:0496H单元的内容判断:
            扩展键盘是否有效 


等待输入字符,然后结束程序;


展开阅读全文

没有更多推荐了,返回首页