汇编两个64位加法的实现

老师上课布置的作业实现64位加法的实现

最开始事懵逼的  但是后面再 草稿本上画了内存 中的存放以及几个

si :源地址寄存器

bx:基址寄存器

di:目的地址寄存器

地址寄存器的使用再想了下就差不多写出来了 先贴出源代码  我会 一步一步 解释源代码 以及把 调试中的内存截图 给你们

在64位上写汇编需要的dosbox 以及 masm一篇文章有写  然后此次比上次多得东西是debug.exe 需要在网上 下载debug.exe

先贴出代码吧 后面再解释

data segment
  x dw 1111h,5678h,8900h,4567h  ;dw代表字型单元读完一个偏移量加2
  y dw 0f666h,4321h,1099h,0f432h  ;
  sum dd ?
data ends
;--------------------------------
code segment
assume cs:code,ds:data
start:
  mov ax,data       ;把数据段的值赋给ax
  mov ds,ax

  mov bx,offset x    ;将x的值得地址给bx
  lea si,y                 ;将y的值得地址给si
  mov di,offset sum;将sum地址的值给cx

  mov ax,[bx]          ;将bx的低位值给ax
  add  ax,[si]           ;相加
  mov [di],ax          ;将结果存在cx的低位中
  
  mov ax,[bx+2]
  adc  ax,[si+2]        ;高位相加
  mov [di+2],ax       ;将高位相加结果存在sum中

  mov ax,[bx+4]
  adc ax,[si+4]
  mov [di+4],ax

  mov ax,[bx+6]
  adc ax,[si+6]
  mov [di+6],ax

;  mov ds,ax
;-----
;  mov word ptr sum,ax
;  mov word ptr sum+2,cx
   adc [di+8],0h       ;将标志位加入
;-----
  mov ax,4c00h
  int 21h
code ends
end start


代码详解
写出代码 存为add.asm 并放入d:\masm文件夹内

汇编两个64位加法的实现_第1张图片

然后在运行中输入cmd 在cmd中d:进入d盘 cd masm进入masm文件夹

键入命令 masm add.asm

键入命令 link add.obj 

敲击4下回车

汇编两个64位加法的实现_第2张图片


之后会在masm文件夹下存在 add.exe



这里说下 add.exe是编译运行出来的执行文件 64位机 该文件 可以在dosbox下执行

如果在cmd下执行会报错

现在 就需要在 dosbox 下面 debug 本程序了


dos box 下面

键入 mount c d\:masm           该句意思是把d:\masm 虚拟为一个32位的c盘

键入 c:                                       进入虚拟的32位c盘 

键入 debug add.exe               debug你写出的add.exe文件


汇编两个64位加法的实现_第3张图片

现在就可以调试了


调试时的基本命令

t  执行下一步

r 查看所有寄存器  用得最多 如果你不知道在干什么 你就 r一下  查看寄存器

d ds: 0 f  查看ds段寄存器下的东西 用得也多

q 退出调试  

先说这些 


下面可以愉快的调试了


data segment
  x dw 1111h,5678h,8900h,4567h  ;dw代表字型单元读完一个偏移量加2
  y dw 0f666h,4321h,1099h,0f432h  ;
  sum dd ?
data ends
;--------------------------------
code segment

这里先看看 寄存器状态

键入r

汇编两个64位加法的实现_第4张图片

这里可以看到 下一条执行的语句  mov ax,076A

以及各个寄存器的值 

键入 t

汇编两个64位加法的实现_第5张图片

可以看到 ax的值变了执行了一步

由于代码太多这样一直截图很麻烦 就不一步一步的解释了 就解释关键的位置
assume cs:code,ds:data
start:
  mov ax,data       ;把数据段的值赋给ax
  mov ds,ax


  mov bx,offset x    ;将x的值得地址给bx
  lea si,y                 ;将y的值得地址给si
  mov di,offset sum;将sum地址的值给cx
  代码执行到这的时候很关键

  这三句话的意思 是把 x ,y  ,sum 的地址分别赋值给 bx si di 相当于指针 

  bx si di 是指针  而[bx] [si] 是他们的值

汇编两个64位加法的实现_第6张图片

看到没 这里 bx si di 的值先后有变化 分别赋值了

他们在内存中的位置可以用d 来看

键入 d ds:0 f

键入 d 

汇编两个64位加法的实现_第7张图片

看到没 在内存中 bx 指向0000 就是之前x的数据 

                              si  指向0008 就是之前y的数据

                              di  指向0010 就是sum的数据

汇编两个64位加法的实现_第8张图片

这里可以清楚的看到 sum 的值存放在di0010所指向的内存中 值是0777

程序完成的加法是  1111h+ 0f666h 结果等于 10777关键是还有一个1呢

没错他就是到了 cy 就是 标志位

汇编两个64位加法的实现_第9张图片

看到没ny 没有标志位变成了 cy 有标志位

好了下面同理 尽情的玩耍吧 debug 很有趣

  mov ax,[bx]          ;将bx的低位值给ax

  add  ax,[si]           ;相加
  mov [di],ax          ;将结果存在cx的低位中

  下面相加这里我就解释一个 

  3条指令完成 x 和 y 的16位的相加 并将结果存在 了 sum 中 下面几个同理  

   还是同样的查看内存
  mov ax,[bx+2]
  adc  ax,[si+2]        ;高位相加
  mov [di+2],ax       ;将高位相加结果存在sum中


  mov ax,[bx+4]
  adc ax,[si+4]
  mov [di+4],ax


  mov ax,[bx+6]
  adc ax,[si+6]
  mov [di+6],ax


;  mov ds,ax
;-----
;  mov word ptr sum,ax
;  mov word ptr sum+2,cx
   adc [di+8],0h       ;将标志位加入

   这里也非常重要 这句话加了一个0  看起来没必要 其实是引入标志位
;-----
  mov ax,4c00h
  int 21h
code ends
end start



你可能感兴趣的:(汇编)