推荐
汇编的初体验【微机原理】
目的
1、安装DosBox 地址
2、建立基于DOS环境模拟器DosBox的汇编语言开发环境,并运行下面给出的汇编语言源程序testa.asm
3、建立基于DOS环境模拟器TC开发环境,并运行下面给出的C源程序testc.c
4、汇编语言源程序testa.asm与C程序testc.c的功能都是在屏幕上显示信息“This is a test!”,试比较汇编语言与C语言编写的源程序、目标程序和可执行程序在文件大小上的异同,理解汇编语言编写程序有哪些好处。
testa.asm源代码如下:
data segment string db "This is a test!$" data ends code segment assume cs:code,ds:data start: mov ax, data mov ds,ax mov ah,09h mov dx,offset string int 21h mov ah,4ch int 21h code ends end start
testc.c源代码如下:
main() { printf("This is a test!"); }
第一部分:汇编语言
在e:\masm首先要有这些文件
编写testa.asm文件
打开DOSBOX
输入指令
把本地的e:\masm挂载到dos环境的C盘
mount c e:\masm
进入c盘(DOS环境下的)
c:
输入masm命令
masm
输入link命令
link
执行testa.c
testa
结果
第二部分:C语言
参考文章
在d:\minc中必须有以下文件
说明
在参考文章里面,下载之后,在三个Disk里找到以上文件,COPY到minc中,就能删了Disk
编写a.c文件
说明我的.c文件默认是dev打开的,就会有图标
可以把a.txt改成a.c
打开DOSBOX
输入指令
把本地的d:minc挂载到dos环境的C盘
mount c d:minc
进入c盘(DOS环境下的)
c:
输入tcc a.c命令
tcc a.c
执行a.c
a
结果
debug加法分析【微机原理】
源文件(有错误)
1.asm
有两出错误
data segment x db 1 y db 2 sum db ? string db "The result of x+y=$" data ends code segment assume cs:code,ds:data start: move ax,data move ds,ax mov dx,offset string mov ah,09h int 21h mov al,x add al,y mov sum,al add al,30h mov dl,al mov ah,02h int 21h mov ah,4ch int 21h code ends end start
发现11行和12行有 error A2105: Excepted: instruction or directive
出现了无法识别的助记符
mov写错成move了
修改
1.asm 修改后
data segment x db 1 y db 2 sum db ? string db "The result of x+y=$" data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,offset string mov ah,09h int 21h mov al,x add al,y mov sum,al add al,30h mov dl,al mov ah,02h int 21h mov ah,4ch int 21h code ends end start
运行
调试
相关文章
可以看出
当前程序段被装入076C:0000开始的单元
数据段被装入内存076A:0000开始的单元
debug显示命令 d 076A:0000
分析
DS是段寄存器
汇编语言 debug 解释 mov ax,data MOV AX,076A AX=076A mov ds,ax MOV DS,AX DS=AX=076A 导致:将数据段(DATA)的首地址赋给AX,然后通过AX将数据段的首地址赋给DS,(因为DS不可以直接被赋值) mov dx,offset string MOV DX,0003 把string在段里的偏移地址送给dx --->0003 offset是个伪操作符,只能在编译的时候用, 用法:offset label 作用是得到label在段内的偏移地址
根据-d命令的结果
x 存储在076A:0000 值为01 y 存储在076A:0001 值为02 sum 存储在076A:0002 值为00 string 存储在076A:[0003,00016) 值为The result of x+y=$
**ah表示ax的高位 **
mov ah,09h ah表示ax的高位 09移入ah int 21h DOS的中断调用 执行中断指令09 ah=09 功能: 显示字符串 调用参数:DS:DX=串地址 '$'结束字符串 导致:根据DX=串地址 0003,显示字符串string
al是ax的低位
汇编语言 debug 解释 mov al,x MOV AL,[0000] 把 [0000]存储的值1 移入 al -->01 add al,y ADD AL,[0001] 把 [0001]存储的值2 加入 al -->03 mov sum,al MOV [0002],AL 把 al存储的值3 移入 存储单元[0002],sum中
汇编语言 debug 解释 add al,30h ADD AL,30 把 AL存储的值03 加入30 al -->33 补充 33是16进制的33H,10进制是16*3+3=51,ASCII值51为3,为了在显示器上输入字符3 mov dl,al MOV DL,AL 把al中的内容放进dl中以便以后显示出来
mov ah,02h ah表示ax的高位 02移入ah int 21h DOS的中断调用 执行中断指令02 ah=02 功能:显示输出 调用参数:DL=输出字符 导致:就会把dl中的字符3,显示出来
mov ah,4ch int 21h DOS的中断调用 执行中断指令4C ah=4c 功能:带返回码结束 调用参数:AL=返回值