一、实验内容
熟悉循环结构设计与调试
题目1要求:从NN单元开始的10个连续单元中存放有10个无符号数,从中找出最小的送入MM单元中。
流程图:
选做题要求:试编写一程序,要求比较两个字符串SREING1和STRING2所含字符是否相同,若相同则显示“MATCH”,若不相同则显示“NOMATCH”.
二.实验步骤橘和
1.将MASM文件夹复制到D:盘根目录下
2.将编好的代码复制到MASM文件夹中,扩展名改为’.asm’
3.搭建DOSBox-汇编环境
4.mount c: d:\wmasm 回车后键入C:,回车
5.对源文件进行汇编
c:\masm xff1228.asm回车
连续输入三个回车(若提示有错误返回源文件修圆亮盯改并重复此步骤)
6.对目标文件进行链接
c:\link xff1228.obj回车
连续键入三个回车键贺
7.运行程序
c:\xff1228.exe回车
8.调试程序
DATASEGMENTARY DW 025AH,1357H,776H,0040H,05C3H,36D0H,720FH,082AH,019DH,0124H
ORG 0050H
MAX DW0
DATAENDS
CODESEGMENT
ASSUME CS:CODE, ES:DATA
ORG 100H
START: MOV CX, 9H 循环次数=数据个数-1
MOV AX, SEG ARY
MOV ES, AX
LEA SI, ARY
MOV AX, ES:[SI]最大值初值
SCHMAX: ADD SI, 2
MOV DX, ES:[SI]
CMP DX, AX
JLE NEXT
MOV AX, DX
JMP NEXT
NEXT: LOOP SCHMAX
FINISH: MOV ES:[MAX], AX
INT 3 暂停,以便查看运行结果
CODEENDS
END START
编译链接生成exe文件, 在Win7的DOS环境用Debug运行通过;
运行结果,找到这10个数的最大值并保存到max单元中,
在Debug中枣码兄,模行运行至INT 3 暂停,可用 D ES:0050 命令查凳袭看到该最大值。
下面是一份 x86-64 汇编代码段,可以实现将 RDX 和 RAX 中的 128 位数据逻辑左移一位(即将高位移到低位,低位填 0)的功能。代码中使用了 64 位裂敬慎寄存器 RDI 来存储左移 *** 作的结果。将 RDX 和 RAX 中的 128 位数据逻辑左移一位,结果存放在 RDI 中
参数:无
返回值:无
section .text
global _start
_start:
将 RAX 的最高位保存到 CF 标志位中
shr rax, 63
将 RDX 的最高位保存到 RAX 的最低位,并将 RAX 的最高位保存到 CF 标志位中
rcl rdx, 1
将 RAX 的最低位保存到 RDX 的最高位
rcr rax, 1
将 RDI 中的数据清零
xor rdi, rdi
将 RDX 和 RAX 中的数据合并,存储到 RDI 中
or rdi, rdx
or rdi, rax
程序结束
mov eax, 1
xor ebx, ebx
int 0x80
代码中使用了 shr(算术右移)和 rcl(循环左移)指令将 RAX 和 RDX 中的数据逻辑左移一位,并将结果存储到 RDI 中肆敬。其中,shr rax, 63 的作用是将 RAX 中的最高位保存到 CF 标志位中;rcl rdx, 1 的作用是将 RDX 中的最高位保存到 RAX 的最低位,并将 RAX 的最高位保存到 CF 标志位中;rcr rax, 1 的作用是将 RAX 的最低位保存到 RDX 的最高位。最后,使用 or 指令将 RDX 和 RAX 中的数据合并,并存储到 RDI 中。
需要注意的是,在本稿念示例中,假设 RAX 和 RDX 中的数据都是无符号整数。如果数据是带符号的,需要考虑符号扩展的问题。此外,代码中也没有进行错误处理,如果输入的数据不符合要求,程序可能会出现异常行为。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)