最基本的8086汇编语言程序
来源:互联网 发布:斐波那契数列java递归 编辑:程序博客网 时间:2024/06/09 19:14
实验名称:汇编语言程序设计
实验日期:2017-05-13
实验环境:DOSBox 0.74
实验环境的安装:
1、为什么64位系统无法运行debug.exe
win10、win8、win7 64位系统均不支持16位。
2、为什么上述64位系统不支持16位,而32位的win7可以
64位windows没有ntvdm,ntvdm.exe描述(以下摘自百度百科):
比如,在32位系统环境下,你运行DOS程序(.com)或其他16位程序后,就会出现这个进程,不是病毒,但32位控制台程序(比如cmd.exe),它运行时并不会出现。64位操作系统则不包括此程序。
ntvdm.exe是Windows 16位虚拟机的一部分。该进程用于使16位的进程能够运行在32位的系统环境下。这个程序对你系统的正常运行是非常重要的。
众所皆知,微软新的桌面操作系统是向下兼容为旧系统开发的应用程序的(比如你可以在xp下玩仙剑奇侠传98柔情版),其中包括运行于DOS内核操作系统以及16位windowsPE格式可执行文件,以及为DOS开发的只包含16位指令、运行于处理器实模式的可执行程序/命令(排除那些试图直接操作硬件的,因为这逾越了NT内核操作系统给应用程序的权限,或者说它们试图运行于处理器的0环,与操作系统内核运行于同一级别,为了内核的安全性,这显然是不能被允许的)。
微软采用了WOW(Windows On Windows)技术使得在xp等NT内核操作系统上可以运行那些为旧版操作系统开发的应用程序,这样我们便可以正常的运行 Windows 98 的甚至是Windows 3.2的计算器程序等。让我们在Windows XP下打开Windows 3.2的应用程序,如记事本,你就会发现 NTVDM 这个程序幽灵般的出现了,还带上了一个子进程 WOWEXEC.exe,这就是 WOW 的一个体现了。
而针对那些为 DOS也就是 CPU运行于实模式的情况下开发的16位程序,微软则使用了DOS虚拟机(VM)的方法。NTVDM虚拟了一台运行DOS的计算机,使得16位程序能够在其中正常运行。
3、解决办法,安装DOSBox模拟器
官网下载:www.dosbox.com
安装方法网上一搜一大把。。。
配置时的一点小技巧:运行安装目录下的DOSBox 0.74 Options.bat可以打开配置文件,我对配置文件做出了如下更改
[sdl]
windowresolution=1024x768
output=opengl
[autoexec]
#Lines in this section will be run at startup.
#You can put your MOUNT lines here.
mountc: c
setPATH=%PATH%;C:\vim\vim73;C:\MASM
C:
sdl段的两行是用于放大屏幕的,dos原始分辨率太下,大屏幕上看不舒服。alt+enter可以全屏
autoexec是模拟器打开之后自动执行的指令
我在这里挂载了安装目录下一个名为"c"的文件夹
并设置了环境变量,我采用的是vim编辑器,masm下放的是debug.exe,link.exe, masm.exe
实验任务:
编写下列程序并调试通过。
1. 通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。
CODESEGMENTASSUMECS:CODEBEGIN:MOVAH,07HINT21HMOVDL,ALMOVAH,02HSUBDL,01HINT 21HADDDL,01HINT21HADDDL,01HINT21HMOVAH, 4CHINT21HCODEENDSENDBEGIN
2. 从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。(定义数据段保存录入字符)
DATASEGMENTARRAYDB 10 DUP(?), 0DH, 0AH, '$'DATAENDSCODE SEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AXMOVAH, 07HMOVCX, 0AHOPR:INT21HMOVBX,CX;SUBBX,01HMOV[BX],ALLOOPOPRMOVAH, 09HLEADX, ARRAYINT21HMOVAH, 4CHINT21HCODEENDSENDBEGIN
3. 编写一个程序,要求比较数组ARRAY中的三个16位补码,并根据比较结果在终端上显示如下信息:
1)如果三个数都不相等,显示0;
2)如果三个输油两个相等,显示1;
3)如果三个数都相当,显示2。
DATASEGMENTARRAYDW 1224H, 1214H, 1234HDATAENDSCODESEGMENTASSUMECS:CODE, DS:DATABEGIN:MOVAX, DATAMOVDS, AXLEABX, ARRAYMOVAX, [BX]MOVDX, 0002H[BX]CMPAX, DXMOVDX, 0004H[BX]JNESTEP1CMPAX, DXJNETAG1MOVDL, '2'MOVAH, 02HINT21HJMPOVERSTEP1:MOVAX, 0002H[BX]CMPAX, DXJETAG1MOV DL, '0'MOVAH,02HINT21HJMPOVERTAG1:MOVDL, '1'MOVAH, 02HINT21H OVER:MOVAH, 4CHINT21HCODEENDSEND BEGIN
4. 编写一个程序,要求通过键盘接收一个个位数N,然后显示N个字母‘$’。
CODESEGMENTASSUMECS:CODEBEGIN:MOVAH, 07HINT21HMOVCL, ALSUBCL, 30HMOVCH, 00HOUT1:MOVDL, '$'MOVAH, 02HINT21HLOOPOUT1MOVAH, 4CHINT21HCODEENDSENDBEGIN
5. 将BX寄存器中的数用16位二进制数形式显示出来。
CODE SEGMENTASSUME CS:CODEBEGIN: MOV AH, 01H INT 21H MOV BH, AL INT 21H MOV BL, AL MOV AH, 02H MOV DL, 0DH INT 21H MOV DL, 0AH INT 21H MOV CX, 16 MOV DH, 80HLOOP16: TEST BH, DH JZ ZERO MOV DL, '1' INT 21H SHL BX,1 LOOP LOOP16 JMP OVERZERO: MOV DL, '0' INT 21H SHL BX,1 LOOP LOOP16OVER: MOV AH,4CH INT 21HCODE ENDS END BEGIN
6. 用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符。
CODESEGMENTASSUMECS:CODEBEGIN: MOVAH,02HMOVCX,16MOVDL,10HMOVBH,15LOOP1:INT21HMOVBL,DLMOVDL,20HINT21HADDBL,1MOVDL,BLLOOPLOOP1MOVCX,16MOVDL,0DHINT21HMOVDL,0AHINT21HMOVDL,BLDECBHJNZLOOP1MOVAL,0MOVAH,4CHINT21HCODEENDSENDBEGIN
- 最基本的8086汇编语言程序
- 最基本的Application程序
- ARM裸机程序开发13汇编语言的基本框架
- 汇编语言程序的基础
- 汇编语言-多个段的程序
- 汇编语言的程序格式
- 最基本的Win32程序----消息机制
- Java程序最基本的加载流程
- 汇编语言程序的程序壳
- 汇编语言程序设计的基本方法
- 一道基本的汇编语言题目
- ARM汇编语言的基本语法
- 汇编语言的Hello world程序
- 编译后的汇编语言程序
- 我的汇编语言程序模板
- 汇编语言程序调用C程序的原则
- Python中使用OpenCV最基本的程序
- 最基本的程序元素—MySQL运算符
- 玩起 Centos 篇
- Gradle:String index out of range: 0
- Oracle数据库的Connection URL格式问题
- tips
- Spring 学习很瘦身1
- 最基本的8086汇编语言程序
- AS配置文件+gradle配置+混淆配置
- BZOJ-1023 [SHOI2008]仙人掌图
- C/C++ "\t"的用法
- 关闭445端口
- 二分贪心04
- 关于素数的简单算法整理
- Quartz 2D编程指南(4) - 颜色和颜色空间
- C++对象模型