MASM, address 9ffffh - debugging

i have some strange things.
Here is example of code.
CODESEGMENT segment
assume CS: CODESEGMENT, DS: CODESEGMENT, SS: NOTHING, ES:NOTHING
org 100h
BEGIN: mov AX, 9fffh
mov DS, AX
mov CX, DS:000FH
;-----------------------------------------------------
;End of program, exit to DOS
;-----------------------------------------------------
mov AX, 4c00h
int 21h
CODESEGMENT ends
end BEGIN
and this code
CODESEGMENT segment
assume CS: CODESEGMENT, DS: CODESEGMENT, SS: NOTHING, ES:NOTHING
org 100h
BEGIN: mov AX, 9000h
mov DS, AX
mov BX, [0FFFFH]
;-----------------------------------------------------
;End of program, exit to DOS
;-----------------------------------------------------
mov AX, 4c00h
int 21h
CODESEGMENT ends
end BEGIN
I think that when i get offset from DS i have, for example this,
DS = 9000h
offset = FFFFh
DS = 9000h * 10h = 90000h
+
0FFFFh
=
9FFFFh
Thinking this way i wrote this two codes.
And i thought this codes did the same thing - reading to CX two bytes from address 9FFFFh, but i looked in masm debugger (afd) and understood that i was wrong.
First code:
Second code
I use masm because i'm student, and i get used to it.
Please can some tell me where is my mistake.

Related

Getting error after copying 8086 code from book

I am having troubles running this 8086 programs that take one letter input from keyboard and outputs "the letter you typed is _"
I just started reading my college book on this and trying to run some code from the book on my computer but got stuck here.
The code below is from my college book.
I am running it in emu8086 emulator.
CODE SEGMENT
; set the DS register
MOV AX, DATA
MOV DS, AX
; Read Keyboard
MOV AH, 08H
INT 21H
; Save input
MOV BL, AL
; Display first part of Message
MOV AH, 09H
MOV DX, OFFSET MESSAGE
INT 21H
; Display character of BL register
MOV AH, 02H
MOV DL, BL
INT 21H
; Exit to DOS
MOV AX, 4C00H
INT 21H
CODE ENDS
DATA SEGMENT
MESSAGE DB “The letter you typed is $”
DATA ENDS
END
The error I am getting is
INT 21h, AH=09h -
address: 00020
byte 24h not found after 2000 bytes.
; correct example of INT 21h/9h:
mov dx, offset msg
mov ah, 9
int 21h
ret
msg db "Hello$"
After further debugging by myself I have concluded there is some problem with this
MOV AX, DATA
MOV DS, AX
If I remove it from my code it executes but with some garbage in the start.
Any suggestions will be appreciated.
Update:
Image of emulator around the string "the letter you typed $"
umm so after giving up for 2 days I referenced another book, and in there they weren't using segments. So I removed segments and the program ran flawlessly here is the new code:
ORG 100H
MOV AH, 08H ; Read Keyboard
INT 21H
MOV BL, AL ; Save input
MOV AH, 09H ; Display first part of Message
MOV DX, OFFSET MESSAGE
INT 21H
MOV AH, 02H ; Display character of BL register
MOV DL, BL
INT 21H
MOV AX, 4C00H ; Exit to DOS
INT 21H
RET
MESSAGE DB "The letter you typed is $"
Thank you to everyone who tried to help me, really appreciated.

I have some problems with masm

I have some problems with masm when I want to run:
CSEG segment
org 100h
Begin:
mov ah, 9
mov dx, offset Message
int 21h
;mov ah, 9
;mov dx, offset mess2
;int 21h
int 20h
mess2 db 'It is me$'
Message db 'Hello, World2243!$'
CSEG ends
end Begin
It prints:
Smth like: ||=It's me!
But I commented this string out!!
I compile this code on DosBox, maybe that's the cause
As already mentioned, you use tasm, not masm. These are two different things, see tasm and masm
In order to print two lines, I used the code:
MODEL TINY
STACK 100h
DATASEG
Hellostr DB 'Hello First Step Site $'
str2 DB 'Step 16 $'
CODESEG
start:
mov ax,#data
mov ds,ax
mov dx,offset Hellostr
mov ah,09h
int 21h
mov dx,offset str2
mov ah,09h
int 21h
mov ah,04Ch
mov al,1h
int 21h
end start
compile + build + run:
mount c C:\path\to\asm\file\PROGRA~1.asm
c:
tasm PROGRA~1.asm
tlink /3 PROGRA~1.obj
PROGRA~1.exe
result:link
I will also note, as indicated in the screenshot above, I have a dosbox version 0.74-3
And lastly: I advise you to look VERY carefully at the screenshot you provided.

Why does the following 8086 assembly code only display numbers up to 2559?

What am I trying to do ?
I want to get a 16-bit number from the user and print It on the console.
What Is the problem ?
Well my code works fine If the number entered Is less than 2600 but the moment I enter 2600 It displays "40" and for 2601 "41" and so on. Shouldn't It display numbers up to 65535 ? Because I am storing the value In the bx register which Is 16-bit and which can store at most 65535. Then why only 2559 ?
My code:
.model small
.data
msg db 10,13,'Enter a 16bit number: $'
newline db 10,13,'$'
.code
main:
mov ax, #data
mov ds, ax
mov cl, 10
mov bx, 0
mov ah, 09h
lea dx, msg
int 21h
call get16bitNum
mov ah, 09h
lea dx, newline
int 21h
mov ax, '$'
push ax
mov ax, bx
store:
div cl
cmp al, 0
mov bh, 0
mov bl, ah
push bx
je continue
mov ah, 0
jmp store
continue:
pop ax
cmp ax, '$'
je ext
mov bx, ax
mov ah, 02h
mov dx, bx
add dx, 48
int 21h
jmp continue
ext:
mov ah, 04ch
int 21h
proc get16bitNum
aggregate:
mov ah, 01h
int 21h
cmp al, 13
je return
mov ah, 0
sub al, 48
mov dx, bx
mov bx, ax
mov ax, dx
mul cl
add bx,ax
jmp aggregate
return:
ret
endp
end main
You don't actually retrieve a 16-bit number!
You keep the desired input in BX, and so you need to multiply the whole of BX by 10. You do this using a word sized multiplication.
proc get16bitNum
aggregate:
mov ah, 01h
int 21h
cmp al, 13
je return
mov ah, 0
sub al, 48 ;AX is 0 to 9
xchg ax, bx ;New digit temporarily in BX
mov cx, 10
mul cx ;Product is in DX:AX, but we won't use DX!
add bx ,ax ;Add new digit
jmp aggregate
return:
ret
You don't display the 16-bit number
The procedure to convert the number into text will definitely need to use the word sized division.
For an excellent explanation on how to do this see this recent post Displaying numbers with DOS. It explains in great detail everything you need to know about converting numbers. It even uses the same technique of pushing some value in the stack (You used a $ character for this) to know where the number ends.
ps. If you find the info in the linked post useful don't hesitate to upvote it. (Of course I hope you find my answer useful too!)
8 bit div produces 8 bit quotient and remainder.
When you divide 2600 by 10 you get an 8 bit quotient, losing higher bits.
You should use 16 bit division.

masm errors : error A2006: undefined symbol : BEGIN

I try to use MASM6.15 on win7(32bit) to write an interrupt solving program.
But I get two strange error message when compiling.
Assembling: int7.asm
int7.asm<19> : error A2206: missing operator in expression
int7.asm<77> : error A2006: undefined symbol : BEGIN
I had marked this two line in the demo.
Thanks a lot!!
DATA SEGMENT
COUNT DW 1
MSG DB 0DH,0AH,'THE BELL IS RINGING!',07H,0DH,0AH,'$'
FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
BEGIN: PUSH DS
XOR AX,AX
PUSH AX
MOV AL,1CH
MOV AH,35H
INT 21H
PUSH ES
PUSH BX
;----------------------
MOV DX,OFF SEG RING
MOV AX,SEG RING ; it shows error here : missing operator
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
;----------------------
IN AL,21H
AND AL,11111110B
OUT 21H,AL
INT 21H
STI
;----------------------
;REPEAT
DELAY: MOV SI,1000H
DELAY1: DEC SI
JNZ DELAY1
AND FLAG,01H
JNZ EXIT1
DEC SI
JNZ DELAY1
EXIT1: MOV FLAG,0
MOV COUNT,1
POP DX
POP DS
MOV AL,1CH
MOV AH,25H
INT 21H
RET
MAIN ENDP
RING PROC FAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
STI
DEC COUNT
JNZ EXIT
MOV DX,OFFSET MSG
MOV AH,09H
INT 21H
MOV COUNT,182
MOV AH,0BH
INT 21H
CMP AL,0
JZ EXIT
MOV FLAG,1
EXIT: CLI
POP DX
POP CX
POP AX
POP DS
IRET
RING ENDP
CODE ENDS
END BEGIN ; it shows that BEGIN is undefined symbol
MOV DX, OFFESET RING
then
why END BEGIN?
BEGIN is simply a label rather than a segment name or a process name
remove END BEGINand add END at the end of file
-----UPDATED-----
Or maybe you want to tell the linker where the program start if you try to use a small memory model.At this time ,you do need to add this line at the end of file: end BEGIN.which will tell linker the label BEGIN is exactly the place where this program should start at.
However, you may get an error from assembler sometimes. like this:
error A2006: undefined symbol : BEGIN
then you should try to move your BEGIN label out of the main procedure(the one you want it to be the entry of this program).And the program looks like :
DATA SEGMENT
COUNT DW 1
MSG DB 0DH,0AH,'THE BELL IS RINGING!',07H,0DH,0AH,'$'
FLAG DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEGIN:
MAIN PROC FAR
PUSH DS
XOR AX,AX
PUSH AX
MOV AL,1CH
MOV AH,35H
INT 21H
PUSH ES
PUSH BX
;----------------------
MOV DX,OFFET RING
MOV AX,SEG RING ; it shows error here : missing operator
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
;----------------------
IN AL,21H
AND AL,11111110B
OUT 21H,AL
INT 21H
STI
;----------------------
;REPEAT
DELAY: MOV SI,1000H
DELAY1: DEC SI
JNZ DELAY1
AND FLAG,01H
JNZ EXIT1
DEC SI
JNZ DELAY1
EXIT1: MOV FLAG,0
MOV COUNT,1
POP DX
POP DS
MOV AL,1CH
MOV AH,25H
INT 21H
RET
MAIN ENDP
RING PROC FAR
PUSH DS
PUSH AX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
STI
DEC COUNT
JNZ EXIT
MOV DX,OFFSET MSG
MOV AH,09H
INT 21H
MOV COUNT,182
MOV AH,0BH
INT 21H
CMP AL,0
JZ EXIT
MOV FLAG,1
EXIT: CLI
POP DX
POP CX
POP AX
POP DS
IRET
RING ENDP
CODE ENDS
END BEGIN

TASM giving no output after compile

I have a program that compiles correctly with zero error or warning but does not display the output I cannot guess the reason for no output
.model small
.data
a dw 1234H
b dw 0100H
.code
Process:
MOV AX, #data
MOV DS, AX
Mov AX, a
MOV BX, b
SUB AX, BX
MOV CH, 04H
MOV CL, 04H
MOV BX, AX
X: ROL BX, CL
MOV DL, BL
AND DL, 0FH
CMP DL, 09
JBE Y
ADD DL, 07
Y: ADD DL, 30H
INT 21H
DEC CH
JNZ X
MOV AH, 4CH
INT 21H
END Process;
If you intend to write characters one at a time to STDOUT then DL should contain the character and AH must be set to 02H before you invoke INT 21H. So,
Y: ADD DL, 30H
MOV AH, 02H
INT 21H
You can also set AH to 02H before the loop starts, saving on the number MOV instructions.

Resources