标签: emu8086

如何在Assembly中获得实时按键?

我有一个用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)

assembly x86-16 emu8086

1
推荐指数
1
解决办法
2501
查看次数

Emu8086 pusha popa

我在装配程序中寻找一种简单的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次弹出.

assembly emu8086

1
推荐指数
1
解决办法
566
查看次数

Why mov ax, [[num] + val] isn't the same as breaking it to instructions

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.

x86 assembly emu8086

1
推荐指数
2
解决办法
77
查看次数

在大会中,商和余数不是去AL,AH吗?这里发生了什么?

我正在网上搜索十六进制到十进制的代码,我偶然发现了这一点.我测试了它,它完美地工作,虽然我不明白为什么.

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)

assembly emu8086

0
推荐指数
1
解决办法
1198
查看次数

为什么汇编字符打印可以返回

以下代码打印字符“a”:

mov dl, ‘a'
mov ah, 2
int 21h
Run Code Online (Sandbox Code Playgroud)

我已经阅读了本手册,发现al我们得到:

返回:AL = 最后一个字符输出

我试图理解的是为什么我们实际上需要这种返回值?当我们在屏幕上获得输出时,这对我来说毫无意义,而且我们在 DL 中已经打印了最后一个字符(因为我们刚刚打印了它)。任何的想法?

assembly x86-16 emu8086

0
推荐指数
1
解决办法
48
查看次数

8086带时间限制的编程

我有一个程序可以在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)

x86 assembly emu8086

0
推荐指数
1
解决办法
84
查看次数

MOV 8位至16位寄存器(AL至BX)

如何解决将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)

assembly sign-extension x86-16 emu8086 zero-extension

0
推荐指数
1
解决办法
99
查看次数

在 16 位寄存器中切换半字节 (8086)

我想切换(反转)的最显著蚕食至少显著四位AX寄存器。为此,汇编语言指令的顺序是什么?

assembly emu8086

0
推荐指数
1
解决办法
420
查看次数

ROL 操作后溢出标志设置为 1,即使它应该是未定义的

我正在使用 emu8086 学习 8086 汇编,我正在玩一些旋转指令,至于我的问题,我知道对于超过 1 位移位/旋转,溢出标志 OF 的行为是未定义的。

但是当我尝试下面的代码时

MOV BH,72H

MOV CL,4

ROL BH,CL
Run Code Online (Sandbox Code Playgroud)

BH 寄存器中的结果为 27H,并且至于标志,进位和溢出标志被设置为 1,即使 OF 不应该被设置,因为它是未定义的。

有人可以解释一下 OF 是如何以及为什么设置在这里的吗?

x86 assembly bit-manipulation eflags emu8086

0
推荐指数
1
解决办法
139
查看次数

我为什么要在2018年学习汇编语言?

我是计算机科学专业的学生.在我的第五学期,我必须学习汇编语言.在我班上6/7周后,我才知道这种汇编语言学习将教会我关于微处理器的知识.但我想知道2018年学习集会有什么优势???

assembly microprocessors emu8086

-1
推荐指数
1
解决办法
2458
查看次数

8086汇编寄存器间接MOV指令

我只是想问:为什么我写的时候:

MOV DL, [BX] 
Run Code Online (Sandbox Code Playgroud)

它有效,但是当我写:

MOV DL, [AX]
Run Code Online (Sandbox Code Playgroud)

不是吗?

assembly low-level x86-16 emu8086

-1
推荐指数
1
解决办法
321
查看次数