据我所知,可执行文件的扩展名 .com .exe 等适用于操作系统。它与底层 ISA(无论是 x86 还是 SPARC)无关。我对么?.com 可执行文件只能在 Windows 操作系统上运行吗?.com 可执行文件是遗留文件吗?
我的汇编代码有问题。我想打印存储在寄存器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) 我有以下程序,可以从 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) 我用的是emu8086。我有一个问题,要求我在从六段输入转换后显示我们在七段显示器上看到的内容。我应该以十六进制输入我的数据,如果它与七段表的十六进制输入匹配,则显示十进制数,例如。3FH = 0, 06H = 1。我使用数组来实现这个程序。下面是工作源程序:
\nORG 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) 我的乒乓项目有问题。我尝试当球击中红色球棒时,它会随机弹回另一侧,但由于某种原因它无法识别红色。我在 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) 基本问题在这里,
我写了以下块:
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.
如何才能做到这一点?如果条件为真,我编写的代码将执行这两条指令。
我正在浏览 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 函数是系统调用 …
我正在为 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) 我正在解决汇编语言编程的一个基本问题,以添加 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) 我正在尝试将 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) x86-16 ×10
assembly ×9
dos ×5
x86 ×3
ascii ×1
att ×1
emu8086 ×1
executable ×1
if-statement ×1
intel-syntax ×1
machine-code ×1
masm ×1
opcode ×1
pong ×1
stack ×1