标签: x86-16

.com 可执行文件可以在 Windows 之外的其他操作系统上运行吗?

据我所知,可执行文件的扩展名 .com .exe 等适用于操作系统。它与底层 ISA(无论是 x86 还是 SPARC)无关。我对么?.com 可执行文件只能在 Windows 操作系统上运行吗?.com 可执行文件是遗留文件吗?

x86 executable dos executable-format x86-16

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

汇编、打印ascii号

我的汇编代码有问题。我想打印存储在寄存器cx中的数字,但是当我尝试打印它时,它打印的是ascii字符而不是ascii数字,所以我决定编写一个过程将ascii字符转换为ascii值。问题是,当我尝试调用该过程时,程序冻结,我必须重新启动 dosbox。有谁知道这段代码有什么问题吗?谢谢。

P4      PROC                
            MOV AX,CX           ;CX = VALUE THAT I WANT TO CONVERT
            MOV BX,10           
    ASC2:
            DIV BX              ;DIV AX/10
            ADD DX,48           ;ADD 48 TO REMAINDER TO GET ASCII CHARACTER OF NUMBER 
            PUSH AX             ;SAVE AX
            MOV AH,2            ;PRINT REMAINDER STORED IN DX
            INT 21H             ;INTERRUP
            POP AX              ;POP AX BACK
            CMP AX,0            
            JZ EXTT             ;IF AX=0, END OF THE PROCEDURE
            JMP ASC2            ;ELSE REPEAT
    EXTT:
            RET
    P4      ENDP
Run Code Online (Sandbox Code Playgroud)

x86 assembly ascii x86-16

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

8086 汇编语言程序从 A 到 Z 打印

我有以下程序,可以从 A 打印到 Z,中间有一个空格。在下面的程序中,我理解了其余的代码,但不明白为什么使用PUSH DX和指令。POP DX如果我运行代码而不使用PUSH DXand POP DX,它只会打印“!” 而不是角色。

.model small
.stack
.data
    VAL DB 'A'

.code
    MAIN PROC
        SPACE MACRO
            MOV DL, ' '
            MOV AH, 02h;
            INT 21H    
        ENDM
        
        MOV AX, @DATA
        MOV DS, AX
        
        MOV CL, 26
        MOV DL, 65 ; MOV DL, VAL
        
        PRINT:
            MOV AH, 02H
            INT 21H
            PUSH DX
            SPACE
            POP DX
            INC DL
            DEC CL
            JNZ PRINT
            
        MOV AH, 4CH
        INT 21H        
            
    MAIN ENDP
    END …
Run Code Online (Sandbox Code Playgroud)

assembly stack dos cpu-registers x86-16

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

跳过未知操作码:66,不是 8086 指令 - 尚不支持

我用的是emu8086。我有一个问题,要求我在从六段输入转换后显示我们在七段显示器上看到的内容。我应该以十六进制输入我的数据,如果它与七段表的十六进制输入匹配,则显示十进制数,例如。3FH = 0, 06H = 1。我使用数组来实现这个程序。下面是工作源程序:

\n
ORG 100H     \n\nMOV AL,[1840H]   \xef\xbc\x9binput in this memory location\nMOV CL,0AH       ; initialize length counter\n   \nAGAIN:  CMP AL,MSG+BX     ; compare to check if the data matches\n        JE RESULT         ; jump to RESULT if data matched\n        INC BX            ; increase decimal output by 1 if data not matched\nLOOP AGAIN\n\nMOV [1841H],0FFH          ; display FF if no data matched the array\n\nHLT\n\nMSG DB 3FH, 06H, 5BH, 4FH,66H, 6DH,7DH,07H,7FH,6FH        ; my array with hexa inputs\n\nRESULT: MOV [1841H],BL                 ; display …
Run Code Online (Sandbox Code Playgroud)

assembly machine-code opcode x86-16 emu8086

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

组装中的 Pong 项目 8086

我的乒乓项目有问题。我尝试当球击中红色球棒时,它会随机弹回另一侧,但由于某种原因它无法识别红色。我在 int = 10h 中使用 AH = 0Dh。检查的部分在 hitcheck 过程中。

这是代码。与我的问题相关。

hitcheck    PROC
;------batt and com check-------
MOV BH, 2H
MOV DX, ballx
MOV CX, bally
SUB CX, 2
MOV AH, 0Dh      
INT 10H

CMP AL, 1
JE hitmovement
CMP AL, 3
JE comhitmovement

MOV BH, 2H
MOV DX, ballx
MOV CX, bally
ADD CX, 2
MOV AH, 0Dh            
INT 10H

CMP AL, 1
JE hitmovement
CMP AL, 3
JE comhitmovement

MOV BH, 2H
MOV DX, ballx
MOV CX, bally …
Run Code Online (Sandbox Code Playgroud)

assembly pong x86-16

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

代码执行条件错误?

基本问题在这里,

我写了以下块:

    IDEAL
    MODEL small
    STACK 100h
    DATASEG

    Var1 db 4
    Var2 db 2

    CODESEG

start:
    mov ax, @data
    mov ds, ax
    xor ax, ax
    mov al, [Var1]
    cmp al, [Var2]
    jg  Var1Greater
    mov ax, 1
Var1Greater:
    mov ax, 0
Run Code Online (Sandbox Code Playgroud)

我是装配新手。

我想创建一个比较 [Var1] 和 [Var2] 的代码。

IF(!) [Var1] 大于 [Var2],则执行mov ax, 1。IF(1) 其他任何东西(等于或小于)执行,mov ax, 0.

如何才能做到这一点?如果条件为真,我编写的代码将执行这两条指令。

x86 assembly if-statement x86-16

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

我们如何仅使用名称访问 DOS 函数,而不使用与之关联的十六进制数?

我正在浏览 MS-DOS 1.25 源代码 MSDOS.ASM,在这里我发现了由名称引入的 MS-DOS 内置函数,如下所示。我们可以看到系统标准函数“RENAME”的实现,这个函数是系统调用23,但是值23没有被使用。

; Standard Functions

DISPATCH DW ABORT ;0 
               DW CONIN 
               DW CONOUT 
               DW READER 
               DW PUNCH 
               DW LIST ;5 
               DW RAWIO 
               DW RAWINP
               DW RENAME

RENAME:     ;System call 23 
CALL MOVNAME 
JC ERRET 
ADD SI,5 
MOV DI,OFFSET DOSGROUP:NAME2 
CALL LODNAME 
JC ERRET 
CALL FINDNAME 
JC ERRET 
OR BH,BH ;Check if I/O device name 
JS ERRET ;If so, can't rename it 
MOV SI,OFFSET DOSGROUP:NAME1 
MOV DI,OFFSET DOSGROUP:NAME3 
MOV CX,6
REP MOVSW
Run Code Online (Sandbox Code Playgroud)

我的困惑是系统将如何识别 RENAME 函数,因为这个相同的函数在不同的模块中可能有不同的名称,并且没有附加十进制或十六进制值。正如我们所看到的,RENAME 函数是系统调用 …

assembly operating-system dos x86-16

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

什么是原始 MS-DOS 源代码中的 DI、EI 和 UP 指令(?)?

我正在为 OS 进行一个汇编语言项目。为此,我通过初始操作系统获取知识。在此过程中,我尝试了解 MS-DOS 1.25。但是当我运行这个文件 IO.ASM 然后我从下面给出的一些行的代码中得到四个错误,在这里我用“<-----this”符号标记了这些行。请指导我。

INIT:
XOR BP,BP       ; Set up 
;stack just below I/O 
;system.
MOV SS,BP
MOV SP,BIOSSEG*16

IF  INTINP-1
MOV AL,0FFH     ; Mask all 
;interrupts.
OUTB BASE+3 <------this
ENDIF

IF  INTINP
DI  ; Set up <------ this
;keyboard interrupt vector.
MOV [BP+64H],KBINT
MOV [BP+66H],CS
EI <-----this
ENDIF

MOV [BP+4*38H],PRNFCB
MOV [BP+4*38H+2],CS
PUSH CS
POP DS
;
; Initialize time-of-day 
;clock.
;
MOV SI,STCTAB
MOV CX,4        ;Initialize 
;4 registers
UP  <------this
INITSTC:
LODB
OUT STCCOM      ;Select …
Run Code Online (Sandbox Code Playgroud)

assembly operating-system dos x86-16

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

MASM:如何解决 8086 编程中的立即模式非法?

我正在解决汇编语言编程的一个基本问题,以添加 BCD 数字和两个 ASCII 数字, 为此我必须分别使用DAA 和 AAA指令,现在我正在尝试将存储在 AX 寄存器中的结果存储到我想要的内存中位置,但不明白为什么下面的代码给我错误立即模式非法 下面是我到目前为止编码的代码,请帮助我如何消除这个错误 PS:我想将我的结果移动到我需要的内存位置只是没有任何特殊用途的寄存器

ASSUME CS:CODE,DS:DATA
DATA SEGMENT
DATA ENDS
CODE SEGMENT
START:
 MOV AX,0000H
 MOV DS,AX
 MOV AL,59
 MOV BL,35
 ADD AL,BL
 DAA
 MOV CX,0000
 MOV ES,CX
 MOV [0000],AX
 MOV AL,04
 MOV BL,05
 ADD AL,BL
 AAA
 MOV CX,0000
 MOV ES,CX
 MOV [0010],AX
 MOV AH,04CH
 INT 21H
CODE ENDS
END START
Run Code Online (Sandbox Code Playgroud)

assembly dos masm addressing-mode x86-16

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

来自 AT&amp;T 语法的 Intel Assembly ljmp 语法

我正在尝试将 xv6 引导代码从 At&t 语法转换为 Intel 语法,但我在使用 ljmp 指令时遇到了问题。我正在尝试学习 Intel 计算机的启动过程,并且我对 Intel 程序集不是特别擅长。

原始的 AT&T 语法是ljmp $0x8, $start32.

最小的例子:

.code16
   jmp 0x8:start32          # won't assemble

.code32
start32:
   nop
Run Code Online (Sandbox Code Playgroud)

使用as -32 -msyntax=intel -mnaked-reg foo.s和GNU Binutils的2.35.1产生
Error: junk ':start32' after expression的远JMP线。

我使用 GNU as 和 gcc 工具。
程序集也可能存在其他问题,例如 gdtdesc 和 gdt。

移植到英特尔语法的完整代码是:

# Start the first CPU: switch to 32-bit protectied mode, jump into C.
# The BIOS loads this code from the first sector of the …
Run Code Online (Sandbox Code Playgroud)

assembly gnu-assembler att intel-syntax x86-16

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