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

简介: 汇编的初体验+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盘

mount c e:\masm

进入c盘(DOS环境下的)

c:

输入masm命令

masm


输入link命令

link

执行testa.c

testa


结果



第二部分:C语言

参考文章

C语言最简开发环境

一个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

运行




调试

相关文章

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命令的结果

 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=返回值
相关文章
|
11月前
|
编译器 Linux C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(上)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
Linux C语言
RISC-V Linux汇编启动过程分析
RISC-V Linux汇编启动过程分析
|
C++
VS code 编写汇编代码【微机原理】3
VS code 编写汇编代码【微机原理】3
77 0
|
11月前
|
编译器 C语言
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)(下)
函数栈帧的创建和销毁(以C语言代码为例,汇编代码的角度分析)
|
编译器 C++ Windows
VS code 编写汇编代码【微机原理】2
VS code 编写汇编代码【微机原理】2
154 0
|
C++ Windows
VS code 编写汇编代码【微机原理】1
VS code 编写汇编代码【微机原理】1
116 0
|
自然语言处理 算法 编译器
C--语言的词法文法语法语义分析及MIPS汇编生成
C--语言的词法文法语法语义分析及MIPS汇编生成
267 0
C--语言的词法文法语法语义分析及MIPS汇编生成
|
存储
汇编实验一 DEBUG调试工具的使用
一、实验目的 1.学习使用DEBUG程序的各种命令。 2.了解计算机取指令、执行指令的工作过程。 3.掌握用DEBUG调试工具自编程序的方法。
379 0
汇编实验一 DEBUG调试工具的使用
JVM系列之:从汇编角度分析NullCheck
JVM系列之:从汇编角度分析NullCheck
JVM系列之:从汇编角度分析NullCheck
手把手教你汇编 Debug(二)
关于汇编的第一篇文章: 爱了爱了,这篇寄存器讲的有点意思 上篇文章了解了一下基本的寄存器,这篇文章我们来进行实际操作一下。 我们以后将会用到很多 Debug 命令,这里我们先来熟悉一下它们
手把手教你汇编 Debug(二)