好的,所以我在8086使用MASM DosBox,我在这里有两个问题,我无法真正找到解决方案。我现在一直在寻找一个没有用的解决方案,所以请保持友善和乐于助人。
我正在为自己做一些项目,这个项目是关于串行通信聊天,其中"欢迎屏幕"首先要求您提供' 用户名'然后将它带到MainMenu ...
首先问题是我希望欢迎屏幕等到另一台PC进入他的用户名'同样,它接收它,让我们说' PartnerName ' ...我无法通过Serial Comm UART-8250发送字符串串口,我只能为密钥发送立即值或ASCII。 (不,我不想循环整个String,Character by Character)那么如何将整个字符串作为一个帧发送?
这里的第二个问题是我在显示器上有一个通知部分,根据用户输入进行更新,事情就是我无法更新它......让我们说它是&# 34; TEST"默认情况下,当用户按下F1时,它应该通过" 更新你发送了一个聊天请求到[ PartnerName ] " ...让&#39 ; s称该字符串为" NotificationMsg "。所以要清楚,我无法更改NotificationMsg的内容,甚至可以添加" PartnerName "到最后。
如果我还不清楚,请随时向我询问您想知道的更多信息。
感谢您的时间,再次请您好好帮助!
编辑:这些是我的代码的部分,根据要求:
这部分来自一个名为"欢迎"的PROC。 AKA欢迎屏幕,它不应该返回,除非我在PartnerName中收到一个字符串我知道我的代码错了
;Reading PlayerName
mov ah,0ah
lea dx,PlayerName
int 21h
; Adding $ at the end, so we can print it later
mov bx,00
mov bl,PlayerName[1]
mov PlayerName[bx+2],'$'
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CHECKING FOR NAME;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SendingName: ;Sending Player Name
mov dx,3fdh
in al,dx
test al,01000000b
jnz SendNameDone
jmp SendingName
SendNameDone:
lea ax,[PlayerName]
mov dx,3f8h
out dx,ax
ReceivingName: ;Receiving PLayer Name
mov dx,3fdh
in al,dx
test al,00000001b
jnz ReceiveNameDone
jmp ReceivingName ;This will occur if nothing is received.
ReceiveNameDone:
mov dx,3f8h
in ax,dx
mov si,ax
mov di,OFFSET PartnerName
mov cx,15
movsb
mov dh,1 ;Row number
mov dl,1 ;Column number
mov bh,0
mov ah,2
int 10h
mov ah,09h
lea dx,PartnerName
int 21h
mov ah,01h
int 21h
这是" MainMenu"的另一部分。应该更新消息的地方
;Notification ONE
mov ah,02
mov dh,23d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:Notif1
int 21h
;Notification TWO
mov ah,02
mov dh,24d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:Notif2
int 21h
WaitKeyPrs:
mov ah,01h ;Check for keystroke in the keyboard buffer.
int 16h
jz ReqRec ;If zero = no key pressed. i.e. We check for Receiving.
mov ah,00h ;Get keystroke from keyboard.
int 16h
cmp al,27d ;Escape pressed !
jz QuitThis
SendReqID:
cmp al,3Bh ;F1 comparing
jz F1Prs
cmp al,3Ch ;F2 comparing
jz F2Prs
jmp WaitKeyPrs
ReqSend: ;We send the Request here !
mov cl,al
mov dx,3fdh ;We check if HoldReg is empty or not
in al,dx
test al,01000000b
jnz SendReqDone
jmp ReqRec
jmp ReqRec
SendReqDone:
mov al,cl
mov dx,3f8h
out dx,al ;By now, the Request should be sent.
jmp ReqRec
F1Prs:
mov ah,02
mov dh,23d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:ChatReqSend
int 21h
jmp ReqSend
F2Prs:
mov ah,02
mov dh,23d
mov dl,00d
int 10h
mov ah,09h
lea dx,DS:GameReqSend
int 21h
jmp ReqSend
在最后一段代码中,Notif1应该根据用户输入更新ChatReqSend或GameReqSend中的内容...所以我只需要在数据段中使用只有一个字符串并将其更新为选择,不只是使用另一个名为ChatReqSend或GameReqSend ...
的字符串这是我的数据细分的一部分:
Data_segment_name segment para
Notif1 db 'TEST $'
Notif2 db 'TEST2 $'
ChatReqSend db 'You sent a Chat Request to.$'
GameReqSend db 'You sent a Game Request to.$'
ChatReqRec db 'You received a Chat Request from.$'
GameReqRec db 'You received a Game Request from.$'
ReqFlag db 00h ;0 If no request, 1 if chat, 2 if game.
PlayerName db 15,?,15 dup(?)
PartnerName db 15 dup (' ')
Data_segment_name ends
答案 0 :(得分:0)
cmp al,3Bh ;F1 comparing
jz F1Prs
cmp al,3Ch ;F2 comparing
jz F2Prs
您需要与AH进行比较。那是具有扫描码的寄存器!
SendNameDone:
lea ax,[PlayerName]
我认为你需要在内存中高出2个字节的地址。
lea dx,DS:Notif1
lea dx,DS:Notif2
lea dx,DS:ChatReqSend
有几次你在DS中使用这些结构:但是你真的在某处初始化了DS寄存器吗?
PlayerName db 15,?,15 dup(?)
这可能会产生缓冲区溢出。您允许DOS输入15个字符,没有空间用于终止回车。更好地使用db 15,0,16,dup(?)
。另请注意,我将第二个字节更改为零。它也有输入意义!