指令集实验王宇航09283020指令集实验实验内容通过观察求素数程序在windlx以及Intel中的运行方式和内存中的存储方式,进行比较和分析。
实验步骤1、安装windlx模拟器,分析、运行其自带的求素数代码。
详细分析其用到的各类机器指令格式。
在windlx中将prim.s文件导入到其中并进行;-------------------------------------------------------------------; Program begins at symbol main; generates a table with the first 'Count' prime numbers from 'Table';-------------------------------------------------------------------.data;*** size of table.global CountCount: .word 10.global TableTable: .space Count*4.text.global mainmain:;*** Initializationaddi r1,r0,0 ;Index in Tableaddi r2,r0,2 ;Current value//r1=r0+0 ; r2=r0+2 ;建立索引并初始化;*** Determine, if R2 can be divided by a value in tableNextValue: addi r3,r0,0 ;Helpindex in Table//r3=r0+0 ;建立帮助索引Loop: seq r4,r1,r3 ;End of Table?bnez r4,IsPrim ;R2 is a prime numberlw r5,Table(R3)divu r6,r2,r5multu r7,r6,r5subu r8,r2,r7beqz r8,IsNoPrimaddi r3,r3,4j Loop//循环判断是否为素数IsPrim: ;*** Write value into Table and increment indexsw Table(r1),r2addi r1,r1,4;*** 'Count' reached?lw r9,Countsrli r10,r1,2sge r11,r10,r9bnez r11,Finish//循环中的子函数,对是素数的进行存储和处理IsNoPrim: ;*** Check next valueaddi r2,r2,1 ;increment R2j NextValue//循环中的子函数,对不是是素数的进行存储和处理Finish: ;*** endtrap 0//程序结束2、编写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,不是素数则返回0int main(int argc, char* argv[]){int b;for(b=2;b<=100;b++){if(isprime(b))printf("%d\n",b);}return 0;}//主函数,利用循环对100以内的数进行判断并输出。
以下为上面的程序翻译过来后的汇编程序。
TITLE F:\学习\程序\求素数\求素数.cpp.386Pinclude listing.incif @Version gt 510.model FLATelse_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'_TEXT ENDS_DATA SEGMENT DWORD USE32 PUBLIC 'DATA'_DATA ENDSCONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS_BSS SEGMENT DWORD USE32 PUBLIC 'BSS'_BSS ENDS$$SYMBOLS SEGMENT BYTE USE32 'DEBSYM' $$SYMBOLS ENDS$$TYPES SEGMENT BYTE USE32 'DEBTYP' $$TYPES ENDS_TLS SEGMENT DWORD USE32 PUBLIC 'TLS'_TLS ENDS; COMDAT ??_C@_03HMFC@?$CFd?6?$AA@CONST SEGMENT DWORD USE32 PUBLIC 'CONST' CONST ENDS; COMDAT ?isprime@@YAHH@Z_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'_TEXT ENDS; COMDAT _main_TEXT SEGMENT PARA USE32 PUBLIC 'CODE'_TEXT ENDSFLAT GROUP _DATA, CONST, _BSSASSUME CS: FLAT, DS: FLAT, SS: FLATendifPUBLIC ?isprime@@YAHH@Z ; isprime; COMDAT ?isprime@@YAHH@Z_TEXT SEGMENT_n$ = 8?isprime@@YAHH@Z PROC NEAR ; isprime, COMDAT ; 7 : {push ebpmov ebp, espsub esp, 68 ; 00000044Hpush ebxpush esipush edilea edi, DWORD PTR [ebp-68]mov ecx, 17 ; 00000011Hmov eax, -858993460 ; ccccccccHrep stosd; 8 : int m=2;mov DWORD PTR _m$[ebp], 2; 9 : for(;m*m<=n;++m)jmp SHORT $L530$L531:mov eax, DWORD PTR _m$[ebp]add eax, 1mov DWORD PTR _m$[ebp], eax$L530:mov ecx, DWORD PTR _m$[ebp]imul ecx, DWORD PTR _m$[ebp]cmp ecx, DWORD PTR _n$[ebp]jg SHORT $L532; 10 : if(n%m==0)mov eax, DWORD PTR _n$[ebp]cdqidiv DWORD PTR _m$[ebp]test edx, edxjne SHORT $L533; 11 : return 0;xor eax, eaxjmp SHORT $L528$L533:; 12 : return 1;jmp SHORT $L531$L532:mov eax, 1$L528:; 13 : }pop edipop esimov esp, ebppop ebpret 0?isprime@@YAHH@Z ENDP ; isprime_TEXT ENDSPUBLIC _mainPUBLIC ??_C@_03HMFC@?$CFd?6?$AA@ ; `string' EXTRN _printf:NEAREXTRN __chkesp:NEAR; COMDAT ??_C@_03HMFC@?$CFd?6?$AA@; File F:\学习\程序\求素数\求素数.cppCONST SEGMENT??_C@_03HMFC@?$CFd?6?$AA@ DB '%d', 0aH, 00H ; `string' CONST ENDS; COMDAT _main_TEXT SEGMENT_b$ = -4_main PROC NEAR ; COMDAT; 16 : {push ebpmov ebp, espsub esp, 68 ; 00000044Hpush ebxpush esipush edilea edi, DWORD PTR [ebp-68]mov ecx, 17 ; 00000011Hmov eax, -858993460 ; ccccccccHrep stosd; 17 : int b;; 18 : for(b=2;b<=100;b++)mov DWORD PTR _b$[ebp], 2jmp SHORT $L539$L540:mov eax, DWORD PTR _b$[ebp]add eax, 1mov DWORD PTR _b$[ebp], eax$L539:cmp DWORD PTR _b$[ebp], 100 ; 00000064Hjg SHORT $L541; 20 : if(isprime(b))mov ecx, DWORD PTR _b$[ebp]push ecxcall ?isprime@@YAHH@Z ; isprimeadd esp, 4test eax, eaxje SHORT $L542; 21 : printf("%d\n",b);mov edx, DWORD PTR _b$[ebp]push edxpush OFFSET FLAT:??_C@_03HMFC@?$CFd?6?$AA@ ; `string'call _printfadd esp, 8$L542:; 22 : }jmp SHORT $L540$L541:; 23 : return 0;xor eax, eax; 24 : }pop edipop esipop ebxadd esp, 68 ; 00000044Hcmp ebp, espcall __chkespmov esp, ebppop ebpret 0_main ENDP_TEXT ENDSEND观察相同的素数在windlx内存以及Intel内存中存储的方式。
素数在windlx内存以及Intel内存中存储的方式有所不同,DLX 指令格式由于 DLX 的寻址方式较少,因此在指令格式中没有专门设置必要的寻址方式。