我有一个用emu8086编写的简单EXE代码,它在屏幕上移动一个字符(现在):
黄色的"*"用箭头键移动.
问题是模拟器获得16次按键.我的意思是当我如此快速地按下按键(或按住一个按键)时,它会按住按键并按下它们移动"*".例如:
在上图中,"*"根据我之前按下的键移动了14次!
我不希望它把我的按键按在堆栈中.如何根据按下的最后一个键而不是堆栈进行实时反应?
PS:这是我从用户那里按下按键的部分,在当前位置打印一个空字符并将"*"移动到新位置:
check_for_key:
; === check for player commands:
mov ah, 01h
int 16h
jz no_key
mov ah, 00h
int 16h
mov cur_dir, ah
; print ' ' at the location:
mov al, ' '
mov ah, 09h
mov bl, 0eh ; attribute.
mov cx, 1 ; single char.
int 10h
call move_star
Run Code Online (Sandbox Code Playgroud) 我在装配程序中寻找一种简单的pusha popa方式.我想使用emu8086来查找程序中的错误,所以不允许使用.286.我试过了:
push_a proc
push ax
push cx
push dx
push bx
push sp
push bp
push si
push di
push_a endp
pop_a proc
pop di
pop si
pop bp
pop sp
pop bx
pop dx
pop cx
pop ax
pop_a endp
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因此当我们"调用push_a"时,我们将堆栈推送到我们现在的地址.还有另一种简单易行的方法吗?我不想每次都写8次推送和8次弹出.
I need to use a pointer to an array and put the third value in ax. My solution:
mov bx, [chrs_ptr]
add bx, 2
mov ax,[bx]
Run Code Online (Sandbox Code Playgroud)
But I couldn't figure out why mov ax, [[chrs_ptr] + 2] gives me the pointer value.
我正在网上搜索十六进制到十进制的代码,我偶然发现了这一点.我测试了它,它完美地工作,虽然我不明白为什么.
DATA SEGMENT
NUM DW 01FH
BUFFER DB 10 DUP ('$')
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV AX,NUM
LEA SI,BUFFER
CALL HEX2DEC
LEA DX,BUFFER
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
HEX2DEC PROC NEAR
MOV CX,0
MOV BX,10
LOOP1:
MOV DX,0
DIV BX ;<--------------------------------
ADD DL,30H ;<----------???
PUSH DX
INC CX
CMP AX,9
JA LOOP1
ADD AL,30H
MOV [SI],AL
LOOP2:
POP AX
INC SI
MOV [SI],AL
LOOP LOOP2
RET
HEX2DEC ENDP …Run Code Online (Sandbox Code Playgroud) 以下代码打印字符“a”:
mov dl, ‘a'
mov ah, 2
int 21h
Run Code Online (Sandbox Code Playgroud)
我已经阅读了本手册,发现al我们得到:
返回:AL = 最后一个字符输出
我试图理解的是为什么我们实际上需要这种返回值?当我们在屏幕上获得输出时,这对我来说毫无意义,而且我们在 DL 中已经打印了最后一个字符(因为我们刚刚打印了它)。任何的想法?
我有一个程序可以在8086中清楚地完成一些任务,我想为我的程序添加一个时间限制.如果我的程序在120秒内没有完成所有任务,那么必须暂停程序.我该怎么做?
我的程序生成一个随机数,并对其进行一些操作并给出一些输出.
org 100h
;CALL TIMER_DISPLAY
GO:
MOV AL,0
MOV ROW,AL
CALL COORDINATE
CALL CLEAR_SCREEN
CALL RANDOM_NUMBER
MOV AL,R
AND AL,5
MOV KEY,AL
MUL R
ADD AL,5
MOV DL,5
DIV DL
MOV KEY1,AH
CMP KEY1,0
JNE GO
LEA BX,M1
CALL DISPLAY_MESSAGE
MOV AL,KEY
OR AL,R
MOV KEY2,AL
CMP KEY2,0
JE GO
CALL COORDINATE
LEA BX,M2
CALL DISPLAY_MESSAGE
MOV AL,KEY
ADD AL,R
SAR AL,2
MOV KEY3,AL
CMP KEY3,0
JE GO
CALL COORDINATE
LEA BX,M3
CALL DISPLAY_MESSAGE
MOV AL,KEY
XOR AL,R
MOV …Run Code Online (Sandbox Code Playgroud) 如何解决将8位值移至BX寄存器(16位)的问题?
mov al, 10h
mov bx, al
Run Code Online (Sandbox Code Playgroud)
为此,我得到:
operands do not match: 16 bit and 8 bit register
Run Code Online (Sandbox Code Playgroud) 我想切换(反转)的最显著蚕食
和至少显著四位的AX寄存器。为此,汇编语言指令的顺序是什么?
我正在使用 emu8086 学习 8086 汇编,我正在玩一些旋转指令,至于我的问题,我知道对于超过 1 位移位/旋转,溢出标志 OF 的行为是未定义的。
但是当我尝试下面的代码时
MOV BH,72H
MOV CL,4
ROL BH,CL
Run Code Online (Sandbox Code Playgroud)
BH 寄存器中的结果为 27H,并且至于标志,进位和溢出标志被设置为 1,即使 OF 不应该被设置,因为它是未定义的。
有人可以解释一下 OF 是如何以及为什么设置在这里的吗?
我是计算机科学专业的学生.在我的第五学期,我必须学习汇编语言.在我班上6/7周后,我才知道这种汇编语言学习将教会我关于微处理器的知识.但我想知道2018年学习集会有什么优势???
我只是想问:为什么我写的时候:
MOV DL, [BX]
Run Code Online (Sandbox Code Playgroud)
它有效,但是当我写:
MOV DL, [AX]
Run Code Online (Sandbox Code Playgroud)
不是吗?