The MASM Forum
General => The Campus => Topic started by: sam on November 19, 2020, 09:19:21 PM
-
CS216 in the Microsoft Macro Assembler (MASM) assembler for writing x86 assembly code.
; The CS240 ISBN-10 Checking Program
;
; Student:
;
; This program validates the ISBN-10 check digit.
;
; Please fix it.
;
; This program runs in SASM
;
;------------------------------------------------------------------
;
%include "io.inc"
section .data
here db "I am here",10,0
msg1 db "Computed checksum=",0
msg2 db " Remainder=",0
isbn1 db "020161262X",0 ; 10 digit ISBN
isbn2 db "020161622X",0 ; 10 digit ISBN
isbn3 db "1814462082",0 ; 10 digit ISBN
okmsg db ' ' ; ISBN is followed by Space, then 'Y'/'N'
okflag db ' ' ; Put 'Y' or 'N' here
db 0x0a ; Newline
db '0' ; terminating zero
section .text
; Main Program
;
global CMAIN
CMAIN:
mov ebp, esp; for correct debugging
; Test the three ISBNs
mov esi,isbn3 ; Test ISBN 3
call isbntest ;isbntest(isbn3) call subroutine with this argument
mov esi,isbn1 ; Test ISBN 1
call isbntest
mov esi,isbn2 ; Test ISBN 2
call isbntest
;
;
xor eax,eax
ret
;-----------------------
; ISBNTEST Subroutine
; Enter with ESI = address of leftmost byte of zero-terminated 10 digit ascii ISBN.
; This will print the isbn followed by Y or N indicating OK or not.
; It will also print the computed checksum and remainder.
;-----------------------
isbntest:
push ecx ; Save registers we will need
push ebx
mov ecx,10 ; ECX position number of digit being added up
; ESI Address of ISBN ascii string
mov eax,0 ; EBX Result
;
; Get here for every loop
;
nextdig:
;; debugging Move this to various points in the program for a debugging write.
PRINT_STRING here
;; end debugging
mov al,[esi] ; al next ascii byte
cmp eax,'X' ;
jne isnotx ; Digit 'X'
mov al, 10 ; has value 10
jmp havenum ;
isnotx:
and esi,dword 0x0f ; Turn digit '0' to '9' into number
havenum:
mul ecx ; EDX:EAX = digit * position
add eax,ebx ; EBX=sum result (edx=0, product fits in eax)
dec esi ; Point to next byte
dec ecx
jnz nextdig
; loop nextdig ; equivalent to: dec ecx, jnz nextdig
mov eax,0
mov edx,ebx ; edx:eax = sum
mov ecx,11 ; divide by 11
div ecx ; EAX = Remainder mod 11 (EDX=quotient)
mov al,'Y' ; If remainder is zero print 'Y' (OK)
sub edx,edx
jz prt
mov al,'N' ; If result is nonzero print 'N'
prt:
mov al,[okflag] ; Put result in message
sub esi,10 ; Restore address of input ISBN
PRINT_STRING [esi] ; print it
PRINT_STRING okmsg ; print OK message
PRINT_STRING okflag ; print the result Y or N
;
; Now print the checksum and remainder for debugging purposes
;
PRINT_STRING msg1 ; "Checksum=" message
mov eax,eax ; Value of checksum
PRINT_DEC 4,eax
PRINT_STRING msg2 ; " Remainder=" message
PRINT_DEC 4,[edx] ; Value of remainder
NEWLINE
NEWLINE
;
popa
ret
Here is the output of the working program:
1814462082 Y
Computed checksum=198 Remainder=0
020161262X N
Computed checksum=106 Remainder=7
020161622X Y
Computed checksum=110 Remainder=0
-
Perhaps you could tell us what assembler you are using and what technical base.
As SASM looks like a typo for MASM and the code looks like 32 bit, make us wiser. The called routines have no known origin unless they are Irvine book procedures.
-
Hi sam,
Welcome to the forum.
Are you using this IDE?
SASM
Simple crossplatform IDE for NASM, MASM, GAS, FASM assembly
https://dman95.github.io/SASM/english.html
-
Perhaps you could tell us what assembler you are using and what technical base.
As SASM looks like a typo for MASM and the code looks like 32 bit, make us wiser. The called routines have no known origin unless they are Irvine book procedures.
32-bit x86 assembly language programming,CS216 the Microsoft Macro Assembler (MASM) assembler. MASM uses the standard Intel syntax for writing x86 assembly code.
-
; This program runs in SASM
%include "io.inc"
section .data
SASM is an IDE apparently thinked for NASM, and you need that io.inc for NASM.
-
32-bit x86 assembly language programming,CS216 the Microsoft Macro Assembler (MASM) assembler. MASM uses the standard Intel syntax for writing x86 assembly code.
Thank you, SAM! I had no idea that 32-bit x86 assembly language was "CS216", whatever that is.
Thank you, too, for the information that Microsoft's Macro Assembler uses the standard Intel syntax for writing
x86 assembly code. I had no idea of any of this valuable information. I shall remember it.
-
dont be so sarcastic deer44.. your supposed to welcoming new AI guided Bots the the forum
regards mike b
-
dont be so sarcastic deer44.. your supposed to welcoming new AI guided Bots the the forum
regards mike b
Ok, Mike.
-
He sounds more like a student than a bot. :tongue:
-
He sounds more like a student than a bot.
Who Hutch? Mike, Sam, or me? Probably not me, most people who know me think I'm too stupid to be a student.
-
:biggrin:
No, it was a response to Mike's comment.
> I'm too stupid to be a student
You may find you are not stupid enough to be a student. :tongue:
-
While everyone else was getting all snarky and stuff about the OP here*, I think I might have found an error (maybe not the error):
isbn3 db "1814462082",0 ; 10 digit ISBN
; Test the three ISBNs
mov esi,isbn3 ; Test ISBN 3
Seems to me that this ought to be
lea esi,isbn3 ; Test ISBN 3
or
mov esi, OFFSET isbn3 ; Test ISBN 3
* Who's obviously a student taking the computer science course CS216.