可能重复:
ASM x86整数溢出
我得到一个除错误溢出,我不知道为什么.这是重现错误的完整代码
include emu8086.inc
org 100h
mov ax, 2
mov bx, 10
div bx
mov ax, 2
mov bx, 2
div bx
ret
Run Code Online (Sandbox Code Playgroud) 例如,我有以下代码(MikeOS).
jmp short bootloader_start ; Jump past disk description section
nop ; Pad out before disk description
...
...
OEMLabel db "MIKEBOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per sector
SectorsPerCluster db 1 ; Sectors per cluster
ReservedForBoot dw 1 ; Reserved sectors for boot record
NumberOfFats db 2 ; Number of copies of the FAT
bootloader_start:
mov ax, 07C0h ; Set up 4K of stack space above buffer
add ax, 544 ; 8k buffer = …Run Code Online (Sandbox Code Playgroud) 我在下面编写了这个程序,但它没有用.我正在输入文件名dur.txt.它返回AX = 4C03.为什么它不起作用,我该如何纠正呢?
.model tiny
.data
max1 db 32
act1 db ?
inp1 db 30 dup(0)
hande dw ?
.code
.startup
;enter the name of the file
lea dx,max1
mov ah,0ah
int 21h
;delete the file
mov ah,41h
lea dx, inp1
int 21h
.exit
end
Run Code Online (Sandbox Code Playgroud) 我目前正在学习装配8086.有些命令适用于ax,有些则不适用.例如:mov [ax],5不起作用.为什么这个以及bx寄存器优于ax寄存器的优点是什么?提前致谢.
我正在大学学习集会.我正在尝试编写个人格式例程,但我遇到了一些问题.例程在引导时启动,但在第一次中断(INT 13h/AH = 7)后进入错误流程.打印AH状态值表明错误是:
检测到0Eh控制数据地址标记(硬盘)
这是我的引导程序代码:
[BITS 16]
[ORG 0x7C00]
init:
call main
ret
main:
xor ax, ax
mov ds, ax
mov si, string0
call print
call delay
mov si, string1
call print
call delay
mov si, string2
call print
call delay
mov si, string3
call print
call delay
mov si, string4
call print
call delay
mov si, string5
call print
call delay
mov si, string6
call print
call delay
mov si, string7
call print …Run Code Online (Sandbox Code Playgroud) 在制作了一个小型引导程序来教我自己的汇编语言后,我注意到该stosb指令似乎不起作用.我将问题压缩到一个最小的例子:
BITS 16
start:
mov ax, 07C0h
add ax, 288
mov ss, ax
mov sp, 4096
mov ax, 07C0h
mov ds, ax ;setting up stack
mov al, 'j'
mov di, buffer
stosb
mov si, buffer
jmp loops
loops:
mov ah, 0Eh
lodsb
cmp al, 0
je done
int 10h
jmp loops
done:
hlt
buffer times 64 db 0
times 510-($-$$) db 0 ; Pad remainder of boot sector with 0s
dw 0xAA55
Run Code Online (Sandbox Code Playgroud)
当运行此引导加载程序时,它应将字母存储j到缓冲区中,然后将该缓冲区打印到显示器.输出应该是:
Ĵ
运行时似乎没有打印任何东西.有什么问题,我该如何解决?
在iAP88/86文档中,移位和旋转的时序信息取决于CL中的移位计数(p2-64).这似乎意味着它在CL中循环计数,进行许多单位移位.
所以我的问题是,在旋转/移位完成后CL仍然具有相同的值,或者操作是否将其计数,类似于LOOP指令的行为?
有人可以向我解释为什么以下程序不会在屏幕上显示任何内容?所以我试图做的是计算一个向量的总和,如下所示:
.model small
.stack 100h
.data
vector db 1,2,3,4,5,6,7,8,9
suma db 0
count db 9
msg db 10,13,"Sum is:$"
.code
mov ax,@data
mov ds,ax
mov si,0
xor si,si
xor cx,cx
mov cl,count
repeta:
mov al,vector[si]
add suma,al
inc si
loop repeta
mov bx,ax
mov ah,09
lea dx,msg
int 21h
mov ah,2
mov dl,bl
int 21h
mov ah,2
mov dl,bl
int 21h
mov ah,4ch
int 21h
end
Run Code Online (Sandbox Code Playgroud) 为什么在下面的代码中我们推送代码段(PUSH CS)然后将其弹出到数据段(POP DS)?
我将这些行明确地表示为line1和line2.请告诉我MOVSW如何在这里工作.
IF HIGHMEMORY
PUSH DS
MOV BX, DS
ADD BX, 10H
MOV ES, BX
PUSH CS. ;line1
POP DS. ;line2
XOR SI, SI
MOV DI, SI
MOV CX, OFFSET SYSSIZE + 1
SHR CX, 1
REP MOVSW. ;line3
POP DS
PUSH ES
MOV AX, OFFSET SECONDRELOCATION
PUSH AX
AAA PROC FAR
RET
AAA ENDP
SECONDRELOCATION:
more code here..............
Run Code Online (Sandbox Code Playgroud)