汇编的初体验+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首先要有这些文件

汇编的初体验+debug加法分析【微机原理】_DOSBOX


编写testa.asm文件

汇编的初体验+debug加法分析【微机原理】_微机原理_02


打开DOSBOX

汇编的初体验+debug加法分析【微机原理】_DOSBOX_03


输入指令

把本地的e:\masm挂载到dos环境的C盘

mount c e:\masm

进入c盘(DOS环境下的)

c:

输入masm命令

masm

汇编的初体验+debug加法分析【微机原理】_DOSBOX_04


输入link命令

link

执行testa.c

testa

汇编的初体验+debug加法分析【微机原理】_c语言_05


结果

汇编的初体验+debug加法分析【微机原理】_微机原理_06

第二部分:C语言

参考文章
​​​C语言最简开发环境​​​​一个C语言源程序是如何到一个可执行程序的​

在d:\minc中必须有以下文件

汇编的初体验+debug加法分析【微机原理】_汇编_07


说明

在参考文章里面,下载之后,在三个Disk里找到以上文件,COPY到minc中,就能删了Disk

汇编的初体验+debug加法分析【微机原理】_汇编_08

编写a.c文件

说明我的.c文件默认是dev打开的,就会有图标

可以把a.txt改成a.c

汇编的初体验+debug加法分析【微机原理】_汇编语言_09


打开DOSBOX

汇编的初体验+debug加法分析【微机原理】_DOSBOX_03


输入指令

把本地的d:minc挂载到dos环境的C盘

mount c d:minc

进入c盘(DOS环境下的)

c:

汇编的初体验+debug加法分析【微机原理】_汇编_11


输入tcc a.c命令

tcc a.c

执行a.c

a

汇编的初体验+debug加法分析【微机原理】_c语言_12

结果

汇编的初体验+debug加法分析【微机原理】_微机原理_13

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

汇编的初体验+debug加法分析【微机原理】_微机原理_14


发现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

运行

汇编的初体验+debug加法分析【微机原理】_DOSBOX_15


汇编的初体验+debug加法分析【微机原理】_DOSBOX_16

调试

相关文章
​​​DOS系统功能调用表(INT 21H)​​​​汇编语言之Debug教程篇​

可以看出
当前程序段被装入076C:0000开始的单元
数据段被装入内存076A:0000开始的单元

debug显示命令 d 076A:0000

汇编的初体验+debug加法分析【微机原理】_DOSBOX_17

分析


汇编的初体验+debug加法分析【微机原理】_DOSBOX_18


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=$

汇编的初体验+debug加法分析【微机原理】_汇编_19


**ah表示ax的高位 **

mov ah,09h          ah表示ax的高位                09移入ah
int 21h DOS的中断调用

执行中断指令09
ah=09
功能: 显示字符串
调用参数:DS:DX=串地址 '$'结束字符串

导致:根据DX=串地址 0003,显示字符串string

汇编的初体验+debug加法分析【微机原理】_c语言_20

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加法分析【微机原理】_汇编_21

汇编语言          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中以便以后显示出来

汇编的初体验+debug加法分析【微机原理】_微机原理_22

mov ah,02h    ah表示ax的高位                02移入ah
int 21h DOS的中断调用

执行中断指令02
ah=02
功能:显示输出
调用参数:DL=输出字符

导致:就会把dl中的字符3,显示出来

汇编的初体验+debug加法分析【微机原理】_微机原理_23

 mov ah,4ch
int 21h DOS的中断调用
执行中断指令4C
ah=4c
功能:带返回码结束
调用参数:AL=返回值