tag:blogger.com,1999:blog-54012681506277795122024-02-19T23:10:05.423-08:0080 * 86 Assembly Language and Computer ArchitecturePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.comBlogger12125tag:blogger.com,1999:blog-5401268150627779512.post-60284772879264693942011-04-10T23:27:00.000-07:002011-04-10T23:27:36.431-07:00Final - Dividing Bit Patterns + manupulate the extraction of the 8-bits and shift right + addition and substraction of the bits + and, or, xor. + floating point operations + binary scientific notations formatting<div dir="ltr" style="text-align: left;" trbidi="on"><br />
; Title: CISS 360 Finals<br />
;------------------------------------------------------------<br />
; Description: This program has different parts of which<br />
; the first portion asks us to be familiar with dividing<br />
; bit patterns and manupulating the quotient and remainder<br />
; The second part makes us manupulate the extraction of the 8-bits<br />
; and shift right it and putting it in the DWORD<br />
; The third part of the problem is to make us be familiar with<br />
; addition and substraction of the bits<br />
; The fourth part of the problem is to make us experienced with<br />
; and, or, xor.<br />
; The fifth part of the problem is to be familiar with the<br />
; floating point operations.<br />
; The sixth part of the problem is to make us experienced with the<br />
; binary scientific notations formatting.<br />
;------------------------------------------------------------<br />
; Programmer: Prajwal Shrestha<br />
; Professor: Ronald J. Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Tuesday, March 01, 2011 12:27 AM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays signed integer value in parameter)<br />
; put_u DWORD/Reg (Displays unsigned integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads signed integer entered at keyboard into parameter)<br />
; get_u DWORD (Loads unsigned integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lable1<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>0h, 0h, 0ebh, 53h<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lable2<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE <span class="Apple-tab-span" style="white-space: pre;"> </span>36h, 2fh, 0adh, 0d5h<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lable3<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>0b6h, 2ch, 0d1h, 35h<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lable4<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>0ffh, 52h, 0adh, 36h<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>praj<span class="Apple-tab-span" style="white-space: pre;"> </span>REAL4<span class="Apple-tab-span" style="white-space: pre;"> </span>28.43<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part1<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>"Part 1 -----------------------------------", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part2<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>"Part 2 -----------------------------------", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part3<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>"Part 3 -----------------------------------", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part4<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>"Part 4 -----------------------------------", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part5<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>"Part 5 -----------------------------------", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part6<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>"Part 6 -----------------------------------", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE<span class="Apple-tab-span" style="white-space: pre;"> </span>" ", 0<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part1_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part2_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part2a_op<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part2b_op<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part3_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part4a_op<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part4b_op<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part4c_op<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part4_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>part6_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>?<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>val_one<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>1000000.0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>val_two<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>10.0<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD<span class="Apple-tab-span" style="white-space: pre;"> </span>10<span class="Apple-tab-span" style="white-space: pre;"> </span>;<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC<br />
<br />
rerun_main:<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--#PART ONE#--||<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lea<span class="Apple-tab-span" style="white-space: pre;"> </span>esi, lable1<span class="Apple-tab-span" style="white-space: pre;"> </span>; getting the effective address of lable1 and putting it in esi<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, DWORD PTR [esi]<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving the bit pattern in to ecx<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>part1<span class="Apple-tab-span" style="white-space: pre;"> </span>; diaplying the part1 message on display<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure so that we can see the bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx in to eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0ff000000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting first 8 bits only<br />
shr<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 24<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting it right 24 positions<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 00ff0000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting 8 bits only<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shr<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 16<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting 16 position right<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>cdq<span class="Apple-tab-span" style="white-space: pre;"> </span>; dividing by eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>idiv<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; dividing by eax ie. A<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shl<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; shift left 8 position<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; concanitating ecx and eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; concanitating ecx and edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ecx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; for display purpose<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>part1_fpop, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to DWORD<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; for display<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_fp<span class="Apple-tab-span" style="white-space: pre;"> </span>part1_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying floating point stored in DWORD<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; For a new line<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--##PART TWO A##--||<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lea<span class="Apple-tab-span" style="white-space: pre;"> </span>esi, lable2<span class="Apple-tab-span" style="white-space: pre;"> </span>; getting the effective address of lable2 and putting it in esi<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, DWORD PTR [esi]<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving the bit pattern in to exc<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to eax to preserve ecx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>part2<span class="Apple-tab-span" style="white-space: pre;"> </span>; diaplying the part1 message on display<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure so that we can see the bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 0ff0000ffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting E and H from the lable2 (ecx) bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shr<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting the bit positions 4 bits right most as according to question<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ebx to edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 00ffff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; AND operation to get the 16 bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; replacing E and H with the result<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>part2a_op, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving the edx bit pattern to a DWORD<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--##PART TWO B##--||<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 000ffff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting F and G from the lable2 (ecx) bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shl<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting the bit positions 4 bits right most as according to question<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0ff0000ffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; getting the bits patterns from first 8 bits and last 8 bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; replacing F and G with the result<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>part2b_op, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving the edx bit pattern to a DWORD<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, part2a_op<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving DWORD value to ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, part2b_op<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving DWORD value to edx<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0ff0000ffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; AND operation with the bits pattern of ebx to get first and last 8-bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 00ffff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; AND operation with the bits pattern of edx to get the second & third 8 bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; concanitating edx and ebx registers<br />
<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing edx to stack<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>part2_fpop, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving edx value to DWORD<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; for the display formatting<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_fp<span class="Apple-tab-span" style="white-space: pre;"> </span>part2_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying the floating point value for the resultant<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for the newline<br />
<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--###PART THREE###--||<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lea<span class="Apple-tab-span" style="white-space: pre;"> </span>esi, lable3<span class="Apple-tab-span" style="white-space: pre;"> </span>; getting the effective address of lable3 and putting it in esi<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, DWORD PTR [esi]<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving the bit pattern in to exc<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to eax to preserve ecx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>part3<span class="Apple-tab-span" style="white-space: pre;"> </span>; diaplying the part1 message on display<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure so that we can see the bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving eax with ecx bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0ff000000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting i only from the whole<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shr<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 24<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting actual bits to right most place and filing others with "0"<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving eax with ecx bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0000ff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting k only from the whole<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shr<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting actual bits to right most place and filing others with "0"<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding eax and ebx is sum of bytes I and K<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shl<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 24<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting left 24 position<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 00ffffffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; AND operation with eax to not include first 8-bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; replacing I with sum<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; substraction<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 00ff0000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting J only<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shr<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 16<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting actual bits to right most place and filing others with "0"<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 000000ffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting J only<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sub<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; subtracting ebx and edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shl<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 16<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting left 16 position<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving eax to edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 0ff00ffffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; AND operation with edx to not include second 8-bits<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; concanitating edx and ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pusing edx<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>part3_fpop, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving edx to DWORD<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_fp<span class="Apple-tab-span" style="white-space: pre;"> </span>part3_fpop;<span class="Apple-tab-span" style="white-space: pre;"> </span>; flaoting point output<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; display newline<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--####PART FOUR####--||<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lea<span class="Apple-tab-span" style="white-space: pre;"> </span>esi, lable4<span class="Apple-tab-span" style="white-space: pre;"> </span>; getting the effective address of lable4 and putting it in esi<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, DWORD PTR [esi]<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving the bit pattern in to exc<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to eax to preserve ecx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>part4<span class="Apple-tab-span" style="white-space: pre;"> </span>; diaplying the part1 message on display<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure so that we can see the bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; Replacing byte M with the "and" of bytes M and N<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to edx register<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 0ff000000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting M, the first 8-bits from ecx<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to ebx register<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 00ff0000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting N, the second 8-bits from ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shl<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting 8 bits position left<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing "and" of bytes M and N<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 00ffffffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; since we need to replace byte M with AND of edx(M) and ebx(N) putting 00 for the first 8 bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; concanitating bits values of two register<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; Replacing the byte N with the "or" if bytes N and O<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to edx for manupulation of ecx and ecx being saved as it is<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 00ff0000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting N, the second 8-bits from edx<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to ebx for manupulation of ecx and ecx being saved as it is<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0000ff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting o, the third 8-bits from edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>shl<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting 8 bits position left<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing OR of N and O ie edx and ebx and saving it to edx<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0ff00ffffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; purpose: to get all the values of the other register but take the value of second 8-bits from the other register<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; since we need to replace byte N with OR of bytes N and O<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; replacing byte P with the "XOR" of byte P with itself<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving ecx to edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, 000000ffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; extracting P which is the last 8-bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>xor<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing XOR P with itself ie. edx with edx that has P<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0ffffff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; purpose: to get all the values of the other register but take the value of last 8-bits from the other register<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; concanitating the eax and edx register bit values<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax to stack so that we can display<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure so that we can see the bit pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>part4_fpop, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving eax value to DWORD<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; for the display formatting<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_fp<span class="Apple-tab-span" style="white-space: pre;"> </span>part4_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying the floating point value for the resultant<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for the newline<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--#####PART FIVE#####--||<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for the newline<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>part5<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying part 5<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for the display<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>finit<span class="Apple-tab-span" style="white-space: pre;"> </span>; initializes the floating point processor, clearing the stack<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fld<span class="Apple-tab-span" style="white-space: pre;"> </span>val_one<span class="Apple-tab-span" style="white-space: pre;"> </span>; loads stack top ST with floating point data value<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fld<span class="Apple-tab-span" style="white-space: pre;"> </span>part1_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; converts integer value to corresponding fp value that is pushed onto the stack<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fld<span class="Apple-tab-span" style="white-space: pre;"> </span>val_two<span class="Apple-tab-span" style="white-space: pre;"> </span>; loads stack top ST with floating point data value<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fldpi<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushes PI onto fp stack <br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fld<span class="Apple-tab-span" style="white-space: pre;"> </span>part3_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; converts integer value to corresponding fp value that is pushed onto the stack<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fdiv<span class="Apple-tab-span" style="white-space: pre;"> </span>st, st(3)<span class="Apple-tab-span" style="white-space: pre;"> </span>; calculates ST / ST(3); <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fxch<span class="Apple-tab-span" style="white-space: pre;"> </span>; exchange values in ST and ST(1)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fmulp<span class="Apple-tab-span" style="white-space: pre;"> </span>st(4), st<span class="Apple-tab-span" style="white-space: pre;"> </span>; multiplies ST(4) and ST; replaces ST(4) by the product & pops ST from stack<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fdiv<span class="Apple-tab-span" style="white-space: pre;"> </span>st, st(3)<span class="Apple-tab-span" style="white-space: pre;"> </span>; calculates ST / ST(3); <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fmulp<span class="Apple-tab-span" style="white-space: pre;"> </span>st(1), st<span class="Apple-tab-span" style="white-space: pre;"> </span>; multiplies ST(1) and ST; replaces ST(1) by the product & pops ST from stack<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fchs<span class="Apple-tab-span" style="white-space: pre;"> </span>; change sign: ST = - ST<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fdiv<span class="Apple-tab-span" style="white-space: pre;"> </span>val_two<span class="Apple-tab-span" style="white-space: pre;"> </span>; pops ST and ST(1); calculates ST(1) / ST; pushes quotient onto the stack<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>fst<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; copies stack top ST value to memory<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>finit<span class="Apple-tab-span" style="white-space: pre;"> </span>; initializes the floating point processor, clearing the stack<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop, 0ffff0000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; zerolize the rightmost two bytes<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for newline<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_fp<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; displays float value in parameter<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for a newline<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; ||--######PART SIX######--||<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for a newline<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>part6<span class="Apple-tab-span" style="white-space: pre;"> </span>; displays part 6<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for a newline<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; for a newline<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing the value of the DWORD in to stack so that we can display it<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>space<span class="Apple-tab-span" style="white-space: pre;"> </span>; formatting as a tab to make display look better<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits proc to display the bits<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>; binary bits in DWORD "part5_fpop" to Scientific Notation<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>;finit<span class="Apple-tab-span" style="white-space: pre;"> </span>; initializes the floating point processor, clearing the stack<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>;fld<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop<span class="Apple-tab-span" style="white-space: pre;"> </span>; loads stack top ST with floating point data value<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>;put_fp<span class="Apple-tab-span" style="white-space: pre;"> </span>part5_fpop<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span> main_done:<br />
<br />
done<span class="Apple-tab-span" style="white-space: pre;"> </span>; display completion/do-again message<br />
cmp<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; EAX = 0?<br />
je<span class="Apple-tab-span" style="white-space: pre;"> </span>rerun_main<span class="Apple-tab-span" style="white-space: pre;"> </span>; yes, go run program again<br />
xor<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
<br />
display_bits PROC<br />
<br />
.DATA<br />
my_mask DWORD ?<br />
space_char DWORD 32<br />
<br />
.CODE <br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp<span class="Apple-tab-span" style="white-space: pre;"> </span>; save base pointer<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp, esp<span class="Apple-tab-span" style="white-space: pre;"> </span>; establish stack frame<br />
<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ebx<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ecx<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing edx<br />
<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; bit-separator counter<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; save bit-separator counter<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, 32<span class="Apple-tab-span" style="white-space: pre;"> </span>; bit-shift counter<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>my_mask, 80000000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; initialize mask<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, DWORD PTR [ebp+8]<span class="Apple-tab-span" style="white-space: pre;"> </span>; get value of parameter<br />
<br />
display_bit:<br />
<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving edx into eax<br />
and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, my_mask<span class="Apple-tab-span" style="white-space: pre;"> </span>; masking<br />
cmp<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; eax = 0?<br />
je<span class="Apple-tab-span" style="white-space: pre;"> </span>display_0<span class="Apple-tab-span" style="white-space: pre;"> </span>; if true goto display<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 1<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving 1 into ebx<br />
put_i<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying bit pattern in ebx<br />
jmp<span class="Apple-tab-span" style="white-space: pre;"> </span>check_separate<span class="Apple-tab-span" style="white-space: pre;"> </span>; goto check_seperate:<br />
<br />
display_0:<br />
<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving 0 into ebx<br />
put_i<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying bit-pattern in ebx<br />
<br />
check_separate:<br />
<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ebx<br />
dec<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; decrementing ebx<br />
cmp<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; ebx != 0<br />
jne<span class="Apple-tab-span" style="white-space: pre;"> </span>shift_mask<span class="Apple-tab-span" style="white-space: pre;"> </span>; if true goto shift_mask<br />
put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>space_char<span class="Apple-tab-span" style="white-space: pre;"> </span>; putting space char<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving 8 in to ebx<br />
<br />
shift_mask:<br />
<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ebx<br />
shr<span class="Apple-tab-span" style="white-space: pre;"> </span>my_mask, 1<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting right the mask by one position<br />
loop<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bit<span class="Apple-tab-span" style="white-space: pre;"> </span>; looping<br />
put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying newline<br />
put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying newline<br />
add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping edx<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ecx<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ebx<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping eax<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ebp<br />
ret<br />
<br />
display_bits ENDP<br />
<br />
proc_name<span class="Apple-tab-span" style="white-space: pre;"> </span>PROC<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<br />
;; proc code inserted here<br />
<br />
;; pop registers used by this proc<br />
<br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
proc_name<span class="Apple-tab-span" style="white-space: pre;"> </span>ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags<span class="Apple-tab-span" style="white-space: pre;"> </span>MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source code<br />
</div>Prajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-37571044484772880162011-04-10T23:20:00.000-07:002011-04-10T23:20:02.166-07:00Programming Assignment 4 - the concept of big endian and little endian!<div dir="ltr" style="text-align: left;" trbidi="on"><br />
<br />
<br />
; Title: CISS 360 Programming Assignment 4<br />
;------------------------------------------------------------<br />
; Description: This program interprets with the concept of big<br />
; endian and little endian. Big Endian is used in UNIX system.<br />
; This pentium assembly language program includes a PROC named<br />
; "Endian" that takes DWORD parameter and reverses its bytes,<br />
; returning the new value in EAX.<br />
; The main PROC is invoked using the PROC for the Endian and a<br />
; display PROC is also used to display the bits.<br />
;------------------------------------------------------------<br />
; Programmer: Prajwal Shrestha<br />
; Professor: Ronald J. Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Wednesday, February 17, 2011 10:20 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays signed integer value in parameter)<br />
; put_u DWORD/Reg (Displays unsigned integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads signed integer entered at keyboard into parameter)<br />
; get_u DWORD (Loads unsigned integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>prompt1<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE "Enter the number to convert or swap: ", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>prompt2<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE "Input Bit Pattern: ", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>prompt3<span class="Apple-tab-span" style="white-space: pre;"> </span>BYTE "Converted (Swaped): ", 0<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>user_input<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD ?<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>DWORD 10<br />
<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC<br />
<br />
rerun_main:<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>prompt1<span class="Apple-tab-span" style="white-space: pre;"> </span>; displays the message to get the input from the user<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>get_i<span class="Apple-tab-span" style="white-space: pre;"> </span>user_input<span class="Apple-tab-span" style="white-space: pre;"> </span>; DWORD user_input gets the input the user types<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; starts the newline for display puropses<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, user_input<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving user_input to the register eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; 1st ELEMENT pushed: pushing eax to procedure<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>prompt2<span class="Apple-tab-span" style="white-space: pre;"> </span>; displays the message to user informing the input bit pattern is..<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; restoring the stack pointer back<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; 1st ELEMENT pushed: pushing eax to procedure <span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>endian<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling endian procedure<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; restoring the stack pointer back<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; 1st ELEMENT pushed: pushing eax to procedure<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>put_str<span class="Apple-tab-span" style="white-space: pre;"> </span>prompt3<span class="Apple-tab-span" style="white-space: pre;"> </span>; displays the message to user the endian bit pattern ie swapped bit pattern is..<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>call<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bits<span class="Apple-tab-span" style="white-space: pre;"> </span>; calling display_bits procedure<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; restoring the stack pointer back<br />
<br />
main_done:<br />
<br />
done<span class="Apple-tab-span" style="white-space: pre;"> </span>; display completion/do-again message<br />
cmp eax, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; EAX = 0?<br />
je rerun_main<span class="Apple-tab-span" style="white-space: pre;"> </span>; yes, go run program again<br />
xor eax, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------ <br />
<br />
<br />
<br />
display_bits PROC<br />
<br />
.DATA<br />
my_mask DWORD ?<br />
space_char DWORD 32<br />
<br />
.CODE <br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp<span class="Apple-tab-span" style="white-space: pre;"> </span>; save base pointer<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp, esp<span class="Apple-tab-span" style="white-space: pre;"> </span>; establish stack frame<br />
<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ebx<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ecx<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing edx<br />
<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; bit-separator counter<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; save bit-separator counter<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx, 32<span class="Apple-tab-span" style="white-space: pre;"> </span>; bit-shift counter<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>my_mask, 80000000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; initialize mask<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, DWORD PTR [ebp+8] ; get value of parameter<br />
<br />
display_bit:<br />
<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving edx into eax<br />
and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, my_mask<span class="Apple-tab-span" style="white-space: pre;"> </span>; masking<br />
cmp<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; eax = 0?<br />
je<span class="Apple-tab-span" style="white-space: pre;"> </span>display_0<span class="Apple-tab-span" style="white-space: pre;"> </span>; if true goto display<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 1<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving 1 into ebx<br />
put_i<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying bit pattern in ebx<br />
jmp<span class="Apple-tab-span" style="white-space: pre;"> </span>check_separate<span class="Apple-tab-span" style="white-space: pre;"> </span>; goto check_seperate:<br />
<br />
display_0:<br />
<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving 0 into ebx<br />
put_i<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying bit-pattern in ebx<br />
<br />
check_separate:<br />
<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ebx<br />
dec<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; decrementing ebx<br />
cmp<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 0<span class="Apple-tab-span" style="white-space: pre;"> </span>; ebx != 0<br />
jne<span class="Apple-tab-span" style="white-space: pre;"> </span>shift_mask<span class="Apple-tab-span" style="white-space: pre;"> </span>; if true goto shift_mask<br />
put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>space_char<span class="Apple-tab-span" style="white-space: pre;"> </span>; putting space char<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving 8 in to ebx<br />
<br />
shift_mask:<br />
<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing ebx<br />
shr<span class="Apple-tab-span" style="white-space: pre;"> </span>my_mask, 1<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting right the mask by one position<br />
loop<span class="Apple-tab-span" style="white-space: pre;"> </span>display_bit<span class="Apple-tab-span" style="white-space: pre;"> </span>; looping<br />
put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying newline<br />
put_ch<span class="Apple-tab-span" style="white-space: pre;"> </span>newline<span class="Apple-tab-span" style="white-space: pre;"> </span>; displaying newline<br />
add<span class="Apple-tab-span" style="white-space: pre;"> </span>esp, 4<span class="Apple-tab-span" style="white-space: pre;"> </span>; adding 4 to esp<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping edx<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ecx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ecx<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ebx<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping eax<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping ebp<br />
ret<br />
<br />
display_bits ENDP<br />
<br />
<br />
endian<span class="Apple-tab-span" style="white-space: pre;"> </span>PROC<br />
<br />
push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp<span class="Apple-tab-span" style="white-space: pre;"> </span>; save base pointer<br />
mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp, esp<span class="Apple-tab-span" style="white-space: pre;"> </span>; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; save ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; save edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx, [ebp + 8]<span class="Apple-tab-span" style="white-space: pre;"> </span>; 1st pushed from main: the user input passed from main to ebx proc<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving value from ebx to eax preserve the value in ebx ie. user input<br />
<br />
;; proc code inserted here<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 000000ffh<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing AND operation with last 8 bits of the eax and all zeros<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sal<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 24<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting left so that it moves 24 position left which gives us the last 8 bits in to first<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing the bits value in eax<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; again getting the fresh user input to eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0000ff00h<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing AND operation with second last 8-bits of the eax AND all zeros<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sal<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting left 8 bits so that it moves 8 position left which would swap the bits pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax to preserve<br />
<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; again getting the fresh user input to eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 00ff0000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing AND operation with second 8-bits of the eax AND all zeros<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sar<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 8<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting right 8 bits so that it moves 8 position right which would swap the bits pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>push<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; pushing eax to preserve<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; again getting the fresh user input to eax<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>and<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 0ff000000h<span class="Apple-tab-span" style="white-space: pre;"> </span>; performing AND operation with first 8-bits of the eax AND all zeros<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>sar<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, 24<span class="Apple-tab-span" style="white-space: pre;"> </span>; shifting right 24 bits so that it moves 24 position right which would swap the bits pattern<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving eax bit-pattern into edx<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pop<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping the eax bit pattern pushed last (latest)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; somewhat like concanitating bit patterns stored in edx and eax<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pop<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping the eax bit pattern pushed last (latest)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; again concanitating bit patterns stored in edx and eax using OR<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pop<span class="Apple-tab-span" style="white-space: pre;"> </span>eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; poping the eax bit pattern pushed last (latest)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>or<span class="Apple-tab-span" style="white-space: pre;"> </span>edx, eax<span class="Apple-tab-span" style="white-space: pre;"> </span>; again concanitating bit patterns stored in edx and eax using OR<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mov<span class="Apple-tab-span" style="white-space: pre;"> </span>eax, edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; moving edx which contains the swaped bit patters to eax<br />
<br />
<br />
;; pop registers used by this proc<br />
<br />
pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebx<span class="Apple-tab-span" style="white-space: pre;"> </span>; restore ebx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pop<span class="Apple-tab-span" style="white-space: pre;"> </span>edx<span class="Apple-tab-span" style="white-space: pre;"> </span>; restore edx<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>pop<span class="Apple-tab-span" style="white-space: pre;"> </span>ebp<span class="Apple-tab-span" style="white-space: pre;"> </span>; restore base pointer<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
ret<br />
<br />
endian<span class="Apple-tab-span" style="white-space: pre;"> </span>ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags<span class="Apple-tab-span" style="white-space: pre;"> </span>MACRO<br />
<br />
fstsw ax<span class="Apple-tab-span" style="white-space: pre;"> </span>; FPU status word to AX<br />
sahf<span class="Apple-tab-span" style="white-space: pre;"> </span>; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source code<br />
<br />
<br />
<br />
</div>Prajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-69980365586842377212011-03-29T11:40:00.001-07:002011-03-29T11:40:17.374-07:00CISS 360 Programming Assignment 3; Title: CISS 360 Programming Assignment 3<br />
;------------------------------------------------------------<br />
; Description: This program searches a double word entered by <br />
; a user in the list of DWORDs array of 14 elements and returns <br />
; a position of the array element found in the array or else<br />
; if not found, the return -1 and informs user that the <br />
; element searched is not found!!<br />
; It used stack and procedure to neatly perform the operation <br />
; by saving the register to be used by the main proc as EAX only!!<br />
;------------------------------------------------------------<br />
; Programmer: Prajwal Shrestha<br />
; Professor: Ronald J. Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Wednesday, February 16, 2011 10:20 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays signed integer value in parameter)<br />
; put_u DWORD/Reg (Displays unsigned integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads signed integer entered at keyboard into parameter)<br />
; get_u DWORD (Loads unsigned integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
prompt1 BYTE "SEARCH (Enter number): ", 0<br />
prompt2 BYTE "FOUND (Position): ", 0<br />
prompt3 BYTE "Element NOT FOUND!", 0<br />
array DWORD 1, 3, 7, 5, 8, 10, 11, 15, 17, 18, 77, 55, 25, 22<br />
total_element DWORD 14<br />
user_input DWORD ?<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC <br />
<br />
rerun_main:<br />
<br />
<br />
put_ch newline ; starts the newline for display puropses<br />
put_str prompt1 ; asks user to Search the number<br />
get_i user_input ; DWORD "user_input" has wat the user enters<br />
put_ch newline ; starts the newline for display puropses<br />
<br />
lea eax, array ; loading the effective address, ie. the first address of the array "array" into register eax<br />
push eax ; 1st ELEMENT pushed: pushing eax to procedure that has the effective address for the array we have to search for user input<br />
<br />
push total_element ; 2nd ELEMENT pushed: pushing total elements in the array to procedure so that we can perform calculations there<br />
<br />
mov eax, user_input ; moving user input element to eax so that we can push it to stack for procedure<br />
push eax ; 3rd ELEMENT pushed: pushing value to be searched into the stack procedure<br />
<br />
call search_number ; calling search_number procedure<br />
add esp, 12 ; restoring stack pointer back<br />
<br />
cmp eax, -1 ; is the value is eax regsister -1?<br />
je value_not_found ; if true, we know and goto value_not_found: <br />
put_str prompt2 ; display found message<br />
put_i eax ; displays the position of the array element found <br />
<br />
jmp end_cmp ; goto end_cmp:<br />
<br />
value_not_found:<br />
put_i eax ; display the value of eax is -1 as the element is not found<br />
put_ch newline ; starts the newline for display puropses<br />
put_str prompt3 ; display message to inform element is not found<br />
put_ch newline ; starts the newline for display puropses<br />
<br />
end_cmp: <br />
put_ch newline ; starts the newline for display puropses<br />
<br />
main_done:<br />
<br />
done ; display completion/do-again message<br />
cmp eax, 0 ; EAX = 0?<br />
je rerun_main ; yes, go run program again<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
search_number PROC<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
push esi ; save esi <br />
push ebx ; save ebx<br />
push edx ; save edx<br />
<br />
push ecx ; save ecx<br />
<br />
mov esi, [ebp + 16] ; 1st pushed from main: the address of array from the main is inserted into the esi proc<br />
mov ebx, [ebp + 12] ; 2nd pushed from main: the number of elements in the array passed from the main to ebx proc<br />
mov edx, [ebp + 8] ; 3rd pushed from main: user input being passed from main to the edx proc<br />
<br />
;; proc code <br />
mov ecx, 1 ; accumulator register being used as counter by setting it to 1<br />
<br />
search_loop:<br />
mov eax, [esi] ; the first element of the array being moved to eax that was pointed by esi<br />
cmp eax, edx ; eax = edx? <br />
je search_found ; if true, goto search_found:<br />
<br />
inc ecx ; increasing counter, ecx by one<br />
add esi, 4 ; now moving to the next element of the array by incresing 4 to the frist element<br />
cmp ecx, ebx ; ecx = ebx?<br />
jng search_loop ; if ecx = ebx is true then goto search_not_found: <br />
<br />
search_not_found:<br />
mov eax, -1 ; displaying -1 if the searched element in the array is not found<br />
jmp end_search_loop ; since we don't want our instruction to go to next line we force it to goto end_search_loop<br />
<br />
search_found: <br />
mov eax, ecx ; moving the value of counter "ecx" to eax so that we get the position of the array element found <br />
<br />
end_search_loop:<br />
<br />
;; pop registers used by this proc<br />
pop esi ; restore esi<br />
pop ebx ; restore ebx<br />
pop edx ; restore edx<br />
pop ecx ; restore ecx<br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
search_number ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-24501852491473589772011-03-29T11:37:00.001-07:002011-03-29T11:37:16.142-07:00CISS 360 Programming Assignment 2; Title: CISS 360 Programming Assignment 2<br />
;------------------------------------------------------------<br />
; Description: This program asks user to enter a number (n) and <br />
; it computes the sum of 1^2 + 2^2 + 3^2 +....+ n^2 and displays <br />
; the sum. <br />
;------------------------------------------------------------<br />
; Programmer: Prajwal Shrestha<br />
; Professor: Ronald J. Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Tuesday, February 01, 2011 8:11 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays signed integer value in parameter)<br />
; put_u DWORD/Reg (Displays unsigned integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads signed integer entered at keyboard into parameter)<br />
; get_u DWORD (Loads unsigned integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
prompt1 BYTE "Enter integer, n: ",0<br />
prompt2 BYTE ", ",0<br />
prompt3 BYTE " ",0<br />
n DWORD 0<br />
sum DWORD 0<br />
value DWORD 0<br />
sum_str BYTE "Sum of integer, n^2!: ",0<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC ; start of main program<br />
<br />
rerun_main:<br />
mov sum, 0 ; moving 0 into sum so that when we rerun the instuctions then it won't have previous sum!<br />
put_ch newline ; for the newline<br />
put_ch newline ; for the newline<br />
put_str prompt1 ; prompt for the integer value<br />
get_i n ; user input saved into n DWORD memory location.<br />
mov ecx, n ; moving the value of n into accumulator register ecx<br />
mov eax, 1 ; moving 1 into eax<br />
<br />
loop_it: <br />
mov value, eax ; move eax into value<br />
mov ebx, eax ; move value of eax into ebx<br />
imul ebx, value ; multiply value with ebx and put it in ebx <br />
add sum, ebx ; adding ebx to sum and putting it in sum<br />
put_i sum ; prints out the sum<br />
cmp ecx, 1 ; ecx = 1 ?<br />
je indenting ; if yes, then goto indenting<br />
put_str prompt2 ; indenting the output only <br />
<br />
indenting:<br />
put_str prompt3 ; special display out for last element in the sum for indenting only!<br />
<br />
inc eax ; adding eax by 1<br />
loop loop_it ; loops back to loop_it untill ecx = 0<br />
<br />
put_ch newline ; for the newline<br />
put_ch newline ; for the newline<br />
put_str sum_str ; displaying the message declared in "sum_str"<br />
put_i sum ; outputting the sum value onto screen<br />
put_ch newline ; for the newline<br />
<br />
main_done:<br />
<br />
done ; display completion/do-again message<br />
cmp eax, 0 ; EAX = 0?<br />
je rerun_main ; yes, go run program again<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
proc_name PROC<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<br />
;; proc code inserted here<br />
<br />
;; pop registers used by this proc<br />
<br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
proc_name ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-4895682775661009682011-03-29T11:35:00.001-07:002011-03-29T11:35:55.923-07:00CISS 360 Programming Assignment 1; Title: CISS 360 Programming Assignment 1<br />
;------------------------------------------------------------<br />
; Description: This program asks the user; pennies, nickles,<br />
; dimes, quarters, 50-cent pieces, dollars and<br />
; puts it in appropriate 32-bit DWORDS. It <br />
; calculates the total number of pennies so<br />
; that we could use the idiv division operation<br />
; to put the quotient ie. dollars in to eax <br />
; register and then remainder ie. cents in to<br />
; edx register of the CPU. It also calcuates <br />
; the total number of coins on the process<br />
; by making use of the same eax register to give <br />
; the output in 32-bit memory slot called numCoins.<br />
;------------------------------------------------------------<br />
; Programmer: Prajwal Shrestha<br />
; Professor: Ronald J. Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Friday, January 21, 2011 12:58 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
;<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
;<br />
; get_ch None (Loads character from keyboard into EAX)<br />
;<br />
; put_str BYTE (Displays string beginning at given address)<br />
;<br />
; put_i DWORD/Reg (Displays integer value in parameter)<br />
;<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
;<br />
; get_i DWORD (Loads integer entered at keyboard into parameter)<br />
;<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
;<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
; defining constants<br />
NICKLE EQU 5<br />
DIME EQU 10<br />
QUARTER EQU 25<br />
HALF EQU 50<br />
DOLLAR EQU 100<br />
<br />
; prompt characters for user information<br />
prompt1 BYTE "Enter Number of Pennies: ",0<br />
prompt2 BYTE "Enter Number of Nickles: ",0<br />
prompt3 BYTE "Enter Number of Dimes: ",0<br />
prompt4 BYTE "Enter Number of Quarters: ",0<br />
prompt5 BYTE "Enter Number of 50 Cent pieces: ",0<br />
prompt6 BYTE "Enter Number of Dollars: ",0<br />
<br />
; output characters for the users<br />
displayInfo BYTE "||Coin Information||",0<br />
displayInfo1 BYTE "--------------------",0<br />
numCoin_str BYTE "Total Number of Coins = ",0<br />
numPennies_str BYTE "Total Number of Pennies = ",0<br />
valueDollar_str BYTE "Total Dollar Value = ",0<br />
valueCent_str BYTE "Total Cent Value = ",0<br />
<br />
; 32-bit memory locations user input<br />
pennies DWORD ?<br />
nickles DWORD ?<br />
dimes DWORD ?<br />
quarters DWORD ?<br />
fiftyCentPieces DWORD ?<br />
dollars DWORD ?<br />
<br />
; 32-bit memory locations for calculations<br />
totalDollar DWORD ?<br />
totalCent DWORD ? <br />
divisor DWORD 100 <br />
numCoins DWORD ?<br />
numPennies DWORD ?<br />
<br />
; to create new line<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC ; start of main program<br />
<br />
;;-------------------------------------------------------<br />
;; Prompt for input coin values<br />
;;-------------------------------------------------------<br />
put_str prompt1 ; prompt for number of pennies<br />
get_i pennies ; get pennies into pennies DWORD<br />
put_ch newline ; output newline<br />
<br />
put_str prompt2 ; prompt for number of nickles<br />
get_i nickles ; get nickles into nickles DWORD<br />
put_ch newline ; output newline<br />
<br />
put_str prompt3 ; prompt for number of dimes<br />
get_i dimes ; get dimes into dimes DWORD<br />
put_ch newline ; output newline<br />
<br />
put_str prompt4 ; prompt for number of quarters<br />
get_i quarters ; get quarters into quarters DWORD<br />
put_ch newline ; output newline<br />
<br />
put_str prompt5 ; prompt for number of 50 Cent pieces<br />
get_i fiftyCentPieces ; get fiftyCentPieces into fiftyCentPieces DWORD<br />
put_ch newline ; output newline<br />
<br />
put_str prompt6 ; prompt for number of dollars<br />
get_i dollars ; get dollars into dollars DWORD<br />
put_ch newline ; output newline<br />
;;-------------------------------------------------------<br />
;; Calculations: Addition, multiplicaton<br />
;;-------------------------------------------------------<br />
mov eax, pennies ; load eax with integer pennies value<br />
add numCoins, eax ; add value of eax register to numCoins<br />
add numPennies, eax ; add value of eax register to numPennies<br />
<br />
mov eax, nickles ; load eax register with nickles value<br />
add numCoins, eax ; add value of eax to numCoins<br />
imul eax, NICKLE ; eax = eax * NICKLE (5) <br />
add numPennies, eax ; add value of eax register to numPennies<br />
<br />
mov eax, dimes ; load eax register with dimes value<br />
add numCoins, eax ; add value of eax to numCoins<br />
imul eax, DIME ; eax = eax * DIME (10)<br />
add numPennies, eax ; add value of eax register to numPennies<br />
<br />
mov eax, quarters ; load eax register with quarters value<br />
add numCoins, eax ; add value of eax to numCoins<br />
imul eax, QUARTER ; eax = eax * QUARTER (25)<br />
add numPennies, eax ; add value of eax register to numPennies<br />
<br />
mov eax, fiftyCentPieces; load eax register with 50-cents value<br />
add numCoins, eax ; add value of eax to numCoins<br />
imul eax, HALF ; eax = eax * HALF (50)<br />
add numPennies, eax ; add value of eax register to numPennies <br />
<br />
mov eax, dollars ; load eax register with dollar value<br />
add numCoins, eax ; add value of eax to numCoins<br />
imul eax, DOLLAR ; eax = eax * DOLLAR (100)<br />
add numPennies, eax ; add value of eax register to numPennies<br />
;;-------------------------------------------------------<br />
;; Calculation: Division<br />
;;-------------------------------------------------------<br />
mov eax, numPennies ; dividend to EAX (it was not necessary but still)<br />
cdq ; prepare EDX for division<br />
idiv divisor ; divide EDX:EAX by divisor<br />
;;-------------------------------------------------------<br />
;; Display Output: number of coins, dollar, cents <br />
;;-------------------------------------------------------<br />
put_ch newline ; output newline<br />
put_str displayInfo1 ; display "--------------------" string<br />
put_ch newline ; output newline<br />
put_str displayInfo ; display "||Coin Information||" string<br />
put_ch newline ; output newline<br />
put_str displayInfo1 ; display "--------------------" string <br />
<br />
put_ch newline ; output newline <br />
put_ch newline ; output another newline<br />
<br />
put_str numCoin_str ; display "Total Number of Coins = " string <br />
put_i numCoins ; display total number of Coins<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
<br />
put_str numPennies_str ; display "Total Number of Pennies = " string <br />
put_i numPennies ; display total number of Pennies<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
<br />
put_str valueDollar_str ; display "Total Number of Dollars = " string <br />
put_i eax ; display total dollars ie. Quotient of two interegs value <br />
put_ch newline ; output newline<br />
put_str valueCent_str ; display "Total Number of Cents = " string <br />
put_i edx ; displays total cents ie. Remainder after division of two integers<br />
put_ch newline ; output newline<br />
<br />
<br />
main_done:<br />
<br />
done<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
proc_name PROC ; sample procedure<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<br />
;; proc code inserted here<br />
<br />
;; pop registers used by this proc<br />
<br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
proc_name ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-66789494251708752102011-03-17T20:09:00.000-07:002011-03-17T20:10:04.031-07:00This program determines whether or not a given string is a palindrome. - By Professor Ronald J. Hart; Title: CISS 360 Demo Program <br />
;------------------------------------------------------------<br />
; Description: This program determines whether or not a given<br />
; string is a palindrome.<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Sunday, January 25, 2011 4:05 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
prompt BYTE "Enter a string: ", 0<br />
input_str BYTE 256 DUP(0)<br />
palin_yes BYTE "Input string is a palindrome",0<br />
palin_no BYTE "Input string is not a palindrome",0<br />
no_input_str BYTE "String not entered",0<br />
one_byte_str BYTE "String has only one byte",0<br />
<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC<br />
<br />
put_str prompt ; prompt user for input string<br />
get_str input_str ; get the string<br />
put_ch newline ; line space on display<br />
mov ecx, 0 ; byte counter<br />
lea edi, input_str ; store starting address of string<br />
<br />
;; loop to count characters in string and to get address of last byte<br />
<br />
loop_it: <br />
<br />
cmp BYTE PTR [edi], 0 ; string terminator?<br />
je stop_scan ; yes, end of scan<br />
inc ecx ; count character<br />
inc edi ; point at next character of string<br />
jmp loop_it ; go check the next character<br />
<br />
stop_scan:<br />
<br />
cmp ecx, 0 ; bytes in input string?<br />
je no_input ; no, go display appropriate message<br />
cmp ecx, 1 ; yes, only one byte?<br />
je one_byte ; yes, go display appropriate message <br />
lea esi, input_str ; no, determine if input string is a palindrome<br />
dec edi ; backup last address<br />
<br />
next_bytes:<br />
<br />
cmp esi, edi ; start address >= ending address?<br />
jge yes_palin ; yes, input string is palindrome<br />
mov bl, BYTE PTR [edi] ; set up to compare characters<br />
cmp BYTE PTR [esi], bl ; characters equal?<br />
jne no_palin ; no, not a palindrome<br />
inc esi ; increment to point at next byte<br />
dec edi ; decrement to point at preceding byte<br />
jmp next_bytes ; go check next two bytes<br />
<br />
yes_palin:<br />
<br />
put_str palin_yes ; display input string is a palindrome<br />
jmp main_done ; go finish program<br />
<br />
no_palin:<br />
<br />
put_str palin_no ; display input string is not a palindrome<br />
jmp main_done ; go finish program<br />
<br />
no_input:<br />
<br />
put_str no_input_str ; tell user no string was input<br />
jmp main_done ; go finish program<br />
<br />
one_byte:<br />
<br />
put_str one_byte_str ; tell user a one-character string was input<br />
<br />
main_done:<br />
<br />
put_ch newline ; display newline... <br />
put_ch newline ; and another<br />
<br />
done ; display "completion" message<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-85333230495525275392011-03-17T20:00:00.000-07:002011-03-17T20:00:10.565-07:00This program demonstrates how a proc is called and how a proc accesses parameters passed to it. - By Professor Ronald J. Hart; Title: CISS 360 Proc Demo 1<br />
;------------------------------------------------------------<br />
; Description: This program demonstrates how a proc is called<br />
; and how a proc accesses parameters passed to it.<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Thursday, January 27, 2011 4:05 PM<br />
;------------------------------------------------------------<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays signed integer value in parameter)<br />
; put_u DWORD/Reg (Displays unsigned integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads signed integer entered at keyboard into parameter)<br />
; get_u DWORD (Loads unsigned integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
x DWORD ?<br />
y DWORD ?<br />
Sum DWORD ?<br />
<br />
prompt_1 BYTE "Enter first integer: ",0<br />
prompt_2 BYTE "Enter second integer: ",0<br />
result BYTE "Sum is ",0<br />
<br />
newline DWORD 10<br />
<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC<br />
<br />
<br />
<br />
rerun_main:<br />
<br />
put_str prompt_1 ; prompt for 1st integer value<br />
get_i x ; get 1st integer value<br />
put_str prompt_2 ; prompt for 2nd integer value<br />
get_i y ; get 2nd integer value<br />
<br />
push y ; push 2nd parameter<br />
push x ; push 1st parameter<br />
<br />
call Adder ; invocation: Adder (x, y)<br />
<br />
add esp, 8 ; clean up stack<br />
mov Sum, eax ; save sum (i.e., value "returned" by proc)<br />
put_str result ; display result label<br />
put_i Sum ; display sum<br />
put_ch newline ; display newline<br />
put_ch newline ; display another newline<br />
<br />
done ; display completion message<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
<br />
main_done:<br />
<br />
done ; display completion/do-again message<br />
cmp eax, 0 ; EAX = 0?<br />
je rerun_main ; yes, go run program again<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
Adder PROC ; sample procedure<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc N/A<br />
<br />
;; proc code inserted here<br />
mov eax, 0 ; initialize accumulator<br />
add eax, DWORD PTR [ebp+8] ; add 1st parameter<br />
add eax, DWORD PTR [ebp+12] ; add 2nd parameter<br />
<br />
;; pop registers used by this proc N/A<br />
<br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
Adder ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-54172053921008901002011-03-17T19:59:00.000-07:002011-03-17T19:59:03.933-07:00This program displays the the sum, difference, product, and quotient (with remainder) of two input integers. - By Professor Ronald J. Hart; Title: CISS 360 Demo Program<br />
;------------------------------------------------------------<br />
; Description: This program displays the the sum, difference,<br />
; product, and quotient (with remainder) of two<br />
; input integers.<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Tuesday, January 13, 2011 4:11 PM<br />
;------------------------------------------------------------<br />
<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
;<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
;<br />
; get_ch None (Loads character from keyboard into EAX)<br />
;<br />
; put_str BYTE (Displays string beginning at given address)<br />
;<br />
; put_i DWORD/Reg (Displays integer value in parameter)<br />
;<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
;<br />
; get_i DWORD (Loads integer entered at keyboard into parameter)<br />
;<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
;<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
prompt1 BYTE "Enter 1st integer: ",0<br />
prompt2 BYTE "Enter 2nd integer: ",0<br />
<br />
sum_str BYTE "Sum = ",0<br />
diff_str BYTE "Difference = ",0<br />
prod_str BYTE "Product = ",0<br />
quot_str BYTE "Quotient = ",0<br />
rem_str BYTE "Remainder = ",0<br />
<br />
value1 DWORD ?<br />
value2 DWORD ?<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC ; start of main program<br />
<br />
;;-------------------------------------------------------<br />
;; Prompt for input integer values<br />
;;-------------------------------------------------------<br />
put_str prompt1 ; prompt for first integer value<br />
get_i value1 ; get first integer value<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
put_str prompt2 ; prompt for second integer value<br />
get_i value2 ; get second integer value<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
;;-------------------------------------------------------<br />
;; Addition<br />
;;-------------------------------------------------------<br />
mov eax, value1 ; load EAX with first integer value<br />
add eax, value2 ; add second integer value to EAX<br />
put_str sum_str ; display "sum" string<br />
put_i eax ; display sum of two integer values<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
;;-------------------------------------------------------<br />
;; Subtraction<br />
;;-------------------------------------------------------<br />
mov eax, value1 ; load EAX with 1st integer value<br />
sub eax, value2 ; EAX = EAX - 2nd integer value<br />
put_str diff_str ; display "difference" string<br />
put_i eax ; display difference of two integer values<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
;;-------------------------------------------------------<br />
;; Multiplication<br />
;;-------------------------------------------------------<br />
mov eax, value1 ; load EAX with 1st integer value<br />
imul eax, value2 ; EAX = EAX * 2nd integer value<br />
put_str prod_str ; display "product" string<br />
put_i eax ; display product of two integer values<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
;;-------------------------------------------------------<br />
;; Division<br />
;;-------------------------------------------------------<br />
mov eax, value1 ; dividend to EAX<br />
cdq ; prepare EDX for division<br />
idiv value2 ; divide EDX:EAX by divisor (value2)<br />
put_str quot_str ; display "quotient" string<br />
put_i eax ; display quotient of two integer values<br />
put_ch newline ; output newline<br />
put_str rem_str ; display "remainder" string<br />
put_i edx ; display remainder after division of two integer values<br />
;;-------------------------------------------------------<br />
put_ch newline ; output newline<br />
put_ch newline ; output newline<br />
done ; macro to display "done" message and get any key<br />
xor eax, eax ; exit with return code 0<br />
ret ; return<br />
<br />
_MainProc ENDP ; end of main program<br />
<br />
;------------------------------------------------------------<br />
<br />
proc_name PROC ; sample procedure<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<br />
;; proc code inserted here<br />
<br />
;; pop registers used by this proc<br />
<br />
pop ebp ; restore base pointer<br />
<br />
ret<br />
<br />
proc_name ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flag MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-29953381325514087522011-03-17T19:57:00.001-07:002011-03-17T19:57:46.349-07:00This program prompts for and obtains two integer values and then computes and displays the sum of the two input values By Professor Ronald J. Hart; Title: CISS 360 Program Demo 2<br />
;------------------------------------------------------------<br />
; Description: This program prompts for and obtains two<br />
; integer values and then computes and displays<br />
; the sum of the two input values.<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Thursday, January 13, 2011 4:07 PM<br />
;------------------------------------------------------------<br />
<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
;<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
;<br />
; get_ch None (Loads character from keyboard into EAX)<br />
;<br />
; put_str BYTE (Displays string beginning at given address)<br />
;<br />
; put_i DWORD/Reg (Displays integer value in parameter)<br />
;<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
;<br />
; get_i DWORD (Loads integer entered at keyboard into parameter)<br />
;<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
;<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
prompt1 BYTE "Enter 1st integer: ",0<br />
prompt2 BYTE "Enter 2nd integer: ",0<br />
<br />
result_str BYTE "Sum = ",0<br />
<br />
value1 DWORD ?<br />
value2 DWORD ?<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC ; start of main program<br />
<br />
put_str prompt1 ; prompt for first integer value<br />
get_i value1 ; get first integer value<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
put_str prompt2 ; prompt for second integer value<br />
get_i value2 ; get second integer value<br />
put_ch newline ; output newline<br />
put_ch newline ; output another newline<br />
<br />
mov eax, value1 ; load EAX with first integer value<br />
add eax, value2 ; add second integer value to EAX<br />
<br />
put_str result_str ; display "result" string<br />
put_i eax ; display sum of two integer values<br />
<br />
done ; macro to display "done" message and get any key<br />
xor eax, eax ; exit with return code 0<br />
ret ; return<br />
<br />
_MainProc ENDP ; end of main program<br />
<br />
;------------------------------------------------------------<br />
<br />
proc_name PROC ; sample procedure<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<br />
;; proc code inserted here<br />
<br />
;; pop registers used by this proc<br />
<br />
pop ebp ; restore base pointer<br />
<br />
ret<br />
<br />
proc_name ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-43409210469024107382011-03-17T19:56:00.000-07:002011-03-17T19:56:05.617-07:00Displays the alphabet forward and backwards and then displays a welcome message - By Professor Ronald J. Hart; Title: CISS 360 Demo Program<br />
;------------------------------------------------------------<br />
; Description: This program displays the alphabet forwards<br />
; and backwards and then displays a welcome<br />
; message.<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Tuesday, January 11, 2011 3:54 PM<br />
;------------------------------------------------------------<br />
<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
;<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
;<br />
; get_ch None (Loads character from keyboard into EAX)<br />
;<br />
; put_str BYTE (Displays string beginning at given address)<br />
;<br />
; put_i DWORD/Reg (Displays integer value in parameter)<br />
;<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
;<br />
; get_i DWORD (Loads integer entered at keyboard into parameter)<br />
;<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
;<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
asterisks BYTE "* * * * * * * * * * * * *",10,13,0<br />
<br />
welcome BYTE "* Welcome to CISS 360! *",10,13,0<br />
<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC ; start of main program<br />
<br />
mov al, 'a' ; start with lowercase 'a'<br />
mov ecx, 26 ; loop counter (num letter in alphabet)<br />
<br />
do_forward:<br />
<br />
put_ch eax ; display current character<br />
inc eax ; add one to character value<br />
loop do_forward ; go display next character<br />
put_ch newline ; done, display newline<br />
put_ch newline ; display another newline<br />
dec eax ; decrement character value (now 'z')<br />
mov ecx, 26 ; re-init loop counter<br />
<br />
do_backward:<br />
<br />
put_ch eax ; display current character<br />
dec eax ; decrement character value <br />
loop do_backward ; go display next character<br />
put_ch newline ; done, display newline<br />
put_ch newline ; display another newline<br />
put_str asterisks ; display string of asterisks<br />
put_str welcome ; display welcome message<br />
put_str asterisks ; display another line of asterisks<br />
put_ch newline ; display newline<br />
<br />
done ; macro to display "done" message and get any key<br />
xor eax, eax ; exit with return code 0<br />
ret ; return<br />
<br />
_MainProc ENDP ; end of main program<br />
<br />
;------------------------------------------------------------<br />
<br />
proc_name PROC ; sample procedure<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc<br />
<br />
;; proc code inserted here<br />
<br />
;; pop registers used by this proc<br />
<br />
pop ebp ; restore base pointer<br />
<br />
ret<br />
<br />
proc_name ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
stat_flags MACRO<br />
<br />
fstsw ax ; FPU status word to AX<br />
sahf ; condition code bits to flags<br />
ENDM<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-32977488556915732502011-03-17T19:53:00.000-07:002011-03-17T19:53:40.439-07:00get_i routine given by Professor Ronald J. Hart; Title: CISS 360 Programming Assignment <br />
;------------------------------------------------------------<br />
; Description: This program reveals the code necessary to<br />
; convert a numeric string entered at the key-<br />
; board to an integer value (essentially it's<br />
; an implementation of the "get_i" function).<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Sunday, February 13, 2011 2:48 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
prompt BYTE 'Enter a positive or negative integer: ',0<br />
result BYTE 'You entered: ',0<br />
<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC<br />
<br />
put_str prompt ; prompt user for an integer value<br />
call my_get_i ; invoke conversion routine<br />
put_str result ; display label for result<br />
put_i eax ; display integer value<br />
put_ch newline ; display newline<br />
put_ch newline ; and another<br />
<br />
main_done:<br />
<br />
done ; display "end-of_program" message<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
my_get_i PROC<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
push ebx ; save registers used by this proc<br />
push edx<br />
xor edx, edx ; accumulate integer value in EDX<br />
mov ebx, 1 ; EBX indicates sign (1 means positive, -1 means negative)<br />
next_char:<br />
get_ch ; input character to EAX<br />
cmp al, ' ' ; al = space?<br />
je next_char ; yes, bypass and get next character<br />
cmp al, 9 ; no, al = tab?<br />
je next_char ; yes, bypass and get next character<br />
cmp al, '-' ; no, al = minus sign?<br />
je negative ; yes, go set "negative" flag<br />
cmp al, '+' ; no, al = plus sign?<br />
je next_byte ; yes, go get next byte of input<br />
cmp al, 10 ; no al = newline?<br />
je fini ; end of input string, finish up<br />
jmp check_digit ; go check byte for a digit<br />
negative:<br />
neg ebx ; make EBX negative (indicates negative value entered)<br />
next_byte:<br />
get_ch ; input next character to EAX<br />
check_digit: <br />
cmp al, 48 ; AL < ascii zero?
jl fini ; yes, go finish up
cmp al, 57 ; no, AL > ascii nine?<br />
jg fini ; yes, go finish up<br />
sub al, 48 ; no, convert ascii digit to integer<br />
imul edx, 10 ; increase current value by power of ten<br />
add edx, eax ; add in current integer byte<br />
jmp next_byte ; go process next input character<br />
fini:<br />
mov eax, edx ; returned integer value in EAX<br />
imul ebx ; set sign of result<br />
pop edx ; restore registers used by this proc<br />
pop ebx <br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
my_get_i ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0tag:blogger.com,1999:blog-5401268150627779512.post-21542626980441858452011-03-17T19:44:00.001-07:002011-03-17T19:44:28.867-07:00Proc Demo by Ronald J. Hart; Title: CISS 360 Proc Demo 1<br />
;------------------------------------------------------------<br />
; Description: This program demonstrates how a proc is called<br />
; and how a proc accesses parameters passed to it.<br />
;------------------------------------------------------------<br />
; Programmer: Ron Hart<br />
;------------------------------------------------------------<br />
; Date/Time: Thursday, January 27, 2011 4:05 PM<br />
;------------------------------------------------------------<br />
.586<br />
.MODEL FLAT<br />
INCLUDE console_io.h ; header file for console input/output<br />
.STACK 4096 ; reserve 4096-byte (1024 DWORD) stack<br />
;------------------------------------------------------------<br />
; Input/Output Facility <br />
;------------------------------------------------------------<br />
; Macro Operand<br />
;<br />
; put_ch DWORD/Reg (Displays character in parameter)<br />
; get_ch None (Loads character from keyboard into EAX)<br />
; put_str BYTE (Displays string beginning at given address)<br />
; put_i DWORD/Reg (Displays integer value in parameter)<br />
; put_fp REAL4/Reg (Displays float value in parameter)<br />
; get_i DWORD (Loads integer entered at keyboard into parameter)<br />
; get_fp REAL4 (Loads float entered at keyboard into parameter)<br />
; get_str BYTE (Loads string entered at keyboard into parameter)<br />
;------------------------------------------------------------<br />
<br />
.DATA ;****************************************************<br />
;* Data Section *<br />
;****************************************************<br />
<br />
x DWORD ?<br />
y DWORD ?<br />
Sum DWORD ?<br />
<br />
prompt_1 BYTE "Enter first integer: ",0<br />
prompt_2 BYTE "Enter second integer: ",0<br />
result BYTE "Sum is ",0<br />
<br />
newline DWORD 10<br />
<br />
.CODE ;****************************************************<br />
;* Code Section *<br />
;****************************************************<br />
<br />
_MainProc PROC<br />
<br />
put_str prompt_1 ; prompt for 1st integer value<br />
get_i x ; get 1st integer value<br />
put_str prompt_2 ; prompt for 2nd integer value<br />
get_i y ; get 2nd integer value<br />
<br />
push y ; push 2nd parameter<br />
push x ; push 1st parameter<br />
<br />
call Adder ; invocation: Adder (x, y)<br />
<br />
add esp, 8 ; clean up stack<br />
mov Sum, eax ; save sum (i.e., value "returned" by proc)<br />
put_str result ; display result label<br />
put_i Sum ; display sum<br />
put_ch newline ; display newline<br />
put_ch newline ; display another newline<br />
<br />
done ; display completion message<br />
xor eax, eax ; exit with return code 0<br />
ret<br />
<br />
_MainProc ENDP<br />
<br />
;------------------------------------------------------------<br />
<br />
Adder PROC ; sample procedure<br />
<br />
push ebp ; save base pointer<br />
mov ebp, esp ; establish stack frame<br />
<br />
;; push registers used by this proc N/A<br />
<br />
;; proc code inserted here<br />
mov eax, 0 ; initialize accumulator<br />
add eax, DWORD PTR [ebp+8] ; add 1st parameter<br />
add eax, DWORD PTR [ebp+12] ; add 2nd parameter<br />
<br />
;; pop registers used by this proc N/A<br />
<br />
pop ebp ; restore base pointer<br />
ret<br />
<br />
Adder ENDP<br />
<br />
;----------------------------------------------------------------------<br />
<br />
END ; end of source codePrajwal Shresthahttp://www.blogger.com/profile/11939700602815080817noreply@blogger.com0