指令集实验王宇航指令集实验
实验内容
通过观察求素数程序在windlx以及Intel中的运行方式和内存中的存储方式,进行比较和分析。
实验步骤
安装windlx模拟器,分析、运行其自带的求素数代码。详细分析其用到的各类机器指令格式。
在windlx中将prim.s文件导入到其中并进行
;-------------------------------------------------------------------
; Program begins at symbol main
; generates a table with the first 'Count' prime numbers from 'Table'
;-------------------------------------------------------------------
.data
;*** size of table
.globalCount
Count:.word10
.globalTable
Table:.spaceCount*4
.text
.globalmain
main:
;*** Initialization
addir1,r0,0;Index in Table
addir2,r0,2 ;Current value
//r1=r0+0 ; r2=r0+2 ;建立索引并初始化
;*** Determine, if R2 can be divided by a value in table
NextValue:addir3,r0,0 ;Helpindex in Table
//r3=r0+0 ;建立帮助索引
Loop:seqr4,r1,r3;End of Table?
bnezr4,IsPrim;R2 is a prime number
lwr5,Table(R3)
divur6,r2,r5
multur7,r6,r5
subur8,r2,r7
beqzr8,IsNoPrim
addir3,r3,4
jLoop
//循环判断是否为素数
IsPrim: ;*** Write value into Table and increment index
swTable(r1),r2
addir1,r1,4
;*** 'Count' reached?
lwr9,Count
srlir10,r1,2
sger11,r10,r9
bnezr11,Finish
//循环中的子函数,对是素数的进行存储和处理
IsNoPrim:;*** Check next value
addir2,r2,1 ;increment R2
jNextValue
//循环中的子函数,对不是是素数的进行存储和处理
Finish: ;*** end
trap0
//程序结束
编写c语言求素数程序,并分析其在Intel机器上执行的汇编代码。
#include "stdafx.h"
#include "stdio.h"
int isprime(int n)
{
int m=2;
for(;m*m<=n;++m)
if(n%m==0)
return 0;
return 1;
}
//循环中的子函数,对是素数的进行存储和处理,是素数则返回1,不是素数则返回0
int main(int argc, char* argv[])
{
int b;
for(b=2;b<=100;b++)
{
if(isprime(b))
printf("%d\n",b);
}
return 0;
}
//主函数,利用循环对100以内的数进行判断并输出。
以下为上面的程序翻译过来后的汇编程序。
TITLEF:\学习\程序\求素数\求素数.cpp
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE'
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA'
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST'
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS'
_BSSENDS
$$SYMBOLSSEG