汇编的初体验+debug加法分析【微机原理】
原创
©著作权归作者所有:来自51CTO博客作者日星月云的原创作品,请联系作者获取转载授权,否则将追究法律责任
汇编的初体验+debug加法分析【微机原理】
推荐
VS code 编写汇编代码【微机原理】
汇编的初体验【微机原理】
目的
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盘
进入c盘(DOS环境下的)
输入masm命令
输入link命令
执行testa.c
结果
第二部分:C语言
参考文章
C语言最简开发环境一个C语言源程序是如何到一个可执行程序的
在d:\minc中必须有以下文件
说明
在参考文章里面,下载之后,在三个Disk里找到以上文件,COPY到minc中,就能删了Disk
编写a.c文件
说明我的.c文件默认是dev打开的,就会有图标
可以把a.txt改成a.c
打开DOSBOX
输入指令
把本地的d:minc挂载到dos环境的C盘
进入c盘(DOS环境下的)
输入tcc a.c命令
执行a.c
结果
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
发现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
运行
调试
相关文章
DOS系统功能调用表(INT 21H)汇编语言之Debug教程篇
可以看出
当前程序段被装入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命令的结果
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=返回值