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

汇编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;

图解在8086模拟器中运行汇编helloworld程序_第1张图片


设置显示模式;

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;执行完后返回;

图解在8086模拟器中运行汇编helloworld程序_第2张图片


图解在8086模拟器中运行汇编helloworld程序_第3张图片

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

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;

图解在8086模拟器中运行汇编helloworld程序_第4张图片

设置数据段为b800h;

图解在8086模拟器中运行汇编helloworld程序_第5张图片


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


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


图解在8086模拟器中运行汇编helloworld程序_第6张图片

后面的类同;

图解在8086模拟器中运行汇编helloworld程序_第7张图片


图解在8086模拟器中运行汇编helloworld程序_第8张图片

显示完毕;

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


int 16h,键盘中断;

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


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

图解在8086模拟器中运行汇编helloworld程序_第9张图片

你可能感兴趣的:(原创教程,汇编语言)