老师上课布置的作业实现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
然后在运行中输入cmd 在cmd中d:进入d盘 cd masm进入masm文件夹
键入命令 masm add.asm
键入命令 link add.obj
敲击4下回车
之后会在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文件
现在就可以调试了
调试时的基本命令
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
这里可以看到 下一条执行的语句 mov ax,076A
以及各个寄存器的值
键入 t
可以看到 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] 是他们的值
看到没 这里 bx si di 的值先后有变化 分别赋值了
他们在内存中的位置可以用d 来看
键入 d ds:0 f
键入 d
看到没 在内存中 bx 指向0000 就是之前x的数据
si 指向0008 就是之前y的数据
di 指向0010 就是sum的数据
这里可以清楚的看到 sum 的值存放在di0010所指向的内存中 值是0777
程序完成的加法是 1111h+ 0f666h 结果等于 10777关键是还有一个1呢
没错他就是到了 cy 就是 标志位
看到没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