标签: x86-16

EMU8086 将 32 位数字除以 16 位数字给出意外的 0 余数

我试图使用 emu8086 工具将(无符号)8A32F4D5除以C9A5。我预计商为AF73H,余数为94B6H。编写以下代码后,我得到了正确的商,但余数变成了0000h。我错过了什么吗?

.MODEL SMALL
.STACK 100H
.DATA 
.CODE 

MAIN PROC 
; initialize DS
MOV AX,@DATA 
MOV DS,AX 
; enter your code here
MOV DX, 8A32H
MOV AX, 0F4D5H 
MOV BX, 0C9A5H

DIV BX

;exit to DOS 
               
MOV AX,4C00H
INT 21H 

MAIN ENDP
    END MAIN 
Run Code Online (Sandbox Code Playgroud)

EMU8086中的输出:

在此输入图像描述

x86 assembly integer-division x86-16 emu8086

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

如何编写一个在 NASM 16 位实模式下打印以 null 结尾的字符串的函数?

我有一个简单的程序,它将一些以空结尾的字符串移动到寄存器bx

[org 0x7c00]    ; Tells the assembler where the code will be loaded
    mov ah, 0x0e

    mov bx, HELLO_MSG   ; Moves string inside of HELLO_MSG to bx
    call print_string   ; Calls the print_string function inside of ./print_string.asm

    mov bx, GOODBYE_MSG ; Moves string inside of GOODBYE_MSG to bx
    call print_string

    jmp $   ; Hangs

%include "print_string.asm"

HELLO_MSG:
    db 'Hello, World!', 0

GOODBYE_MSG:
    db 'Goodbye!', 0

    times 510-($-$$) db 0
    dw 0xaa55
Run Code Online (Sandbox Code Playgroud)

和一个print_string内部函数./print_string.asm

print_string:
    mov …
Run Code Online (Sandbox Code Playgroud)

x86 assembly bios nasm x86-16

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

汇编指令“Intel 组”类别源自何处?

在开发 86-DOS 应用程序lDebug的分支期间,我遇到了称为“Intel 组”的指令类别。具体来说,组是指与使用相同 1 或 2 个操作码字节的一组指令相关的东西,通过/rModR/M 字节的字段来区分。

“Intel 组”类别可以一直追溯到 1997 年发布的 FreeDOS Debug 0.95,并且可以在我的 fddebug 存储库的修订版中看到:

/*
 *  Here are the tables for the main processor groups.
 */

struct {
    int seq;    /* sequence number of the group */
    int info;   /* which group number it is */
}
    grouptab[]  = {
        {0x80, GROUP(1)},   /* Intel group 1 */
        {0x81, GROUP(1)},
        {0x83, GROUP(2)},
        {0xd0, GROUP(3)},   /* Intel group 2 */
        {0xd1, GROUP(3)},
        {0xd2, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly intel machine-code x86-16

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

8086 (x86-16) CPU 堆栈指针的初始值是多少?

  1. SS、SP、BP的初始值是多少?它们是否为空 (0x0) 或者例如 SP 是否立即设置为 0xFFFE?

  2. 当我们编写汇编代码而不使用 pop 和 push 语句时,堆栈指针是否设置为一个值?

boot assembly cpu-registers x86-16 stack-pointer

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

IBM 5150 - int 21h 损坏段寄存器

我一直在模拟 IBM 5150、PC-DOS 1.0、IBM Macro Assembler 1.0 上进行汇编。(86框3.7.1)

我从一个简单的“Hello World”开始:

stack    segment   stack                                                        
         db        80h dup(?)                                                   
stack    ends                                                                   
                                                                                
data     segment                                                                
msg      db        'Hello World!',13,10,'$'                                     
data     ends                                                                   
                                                                                
code     segment                                                                
         assume    cs:code,ds:data                                              
         mov       dx, seg msg                                                  
         mov       ds, dx                                                       
         mov       dx, offset msg                                               
         mov       ah, 09h                                                      
         int       21h                                             
         int       20h                                                          
code     ends                                                                   
                                                                                
         end
Run Code Online (Sandbox Code Playgroud)

遗憾的是,程序在输出后崩溃了。通过调试我发现,在 21h 中断之后,DS、CS 和 IP 寄存器被损坏。

a:debug hello.exe
-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=0080  BP=0000  SI=0000  DI=0000  
DS=049F  ES=049F  SS=04B1  CS=04AF  IP=0000   NV UP DI PL NZ …
Run Code Online (Sandbox Code Playgroud)

x86 assembly dos masm x86-16

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

最初的 16 位 x86 中是否有过 8 位内存寻址?

在实模式和 32 位保护模式下,16 位寻址用于通过 ModR/M 字节来引用存储器。此寻址仅在使用旧前缀的 i386 指令中受支持,在 x86-64 指令中完全不受支持。

然而,ModR/M 字节也被 8 位特定操作码使用,这让我怀疑原始16 位 x86 指令集中是否存在 8 位寻址。尽管 8 位地址非常有限,但完全可以使用不同的操作码以与 16 位指令相同的方式对此类指令进行编码。

例如,代替

add (bx, si), ax
Run Code Online (Sandbox Code Playgroud)

你会有

add (bl, dh), al
Run Code Online (Sandbox Code Playgroud)

很难找到任何 i386 之前的文档,所以我一无所知。这曾经被支持过吗?

x86 assembly addressing-mode x86-16

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

为什么 BH 不用作 BIOS 电传打字功能中的参数 (`ah=0Eh` `int 10h`)?

中断ah=0Eh int 10h在屏幕上显示一个字符,它有几个参数,其中包括BH,本来应该表示页码,但是经过几次测试我发现BH完全没有用。即使我更改页码,无论如何,字符仍将显示在活动页面上。

拉尔夫·布朗的中断列表说

“日期为 1981/4/24 和 1981/10/19 的 IBM PC ROM 要求 BH 与当前活动页面相同”

互联网上的一个页面这样写道: https: //www.ic.unicamp.br/~celio/mc404-2004/service_interrupts#int10h_0Eh

此功能在屏幕上显示一个字符,根据需要推进光标并滚动屏幕。打印始终在当前活动页面上进行。

我必须信任哪个来源,我使用没有操作系统的虚拟盒子,并且我使用引导加载程序。

我明确表示我不理解此信息

1981/4/24 和 1981/10/19 的 IBM PC ROM 要求 BH 与当前活动页面相同

知道我使用 Virtual Box,我不认为 Virtual Box 使用 1981 年 IMG PC 上的 ROM?

assembly virtualbox interrupt bios x86-16

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

在8086 + MOVSB中连接两个给定的字符串不起作用

我正在尝试编写一个8086汇编程序来连接两个给定的字符串.为了做到这一点,我使用了" REP MOVSB "指令,但程序运行不正常.所以我编写了一个应该静态连接两个字符串的程序,但似乎" REP MOVSB "根本不影响字符串.这是我为测试编写的代码部分:

                                          
data    segment

string1 db  "Lotfi", 0
string2 db  "Ali ", 0 

data ends


code segment    

ASSUME  CS: code, DS: data

start:
    cld
    mov     ax  , data
    mov     DS  , ax

    mov     SI  , offset string1
    mov     DI  , offset string2
    add     DI  , 3 ; Adding the length of destination string to the DI


    mov     cx  , 5
    rep movsb ; This should concat two strings

    ; Printing the result character by character …

assembly x86-16

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

在QEMU中诊断引导加载程序代码?

在QEMU中诊断引导加载程序代码?

我试图创建一个最小的“引导程序代码”,该代码打印字符“ A”,然后停止。

我为此编写了以下C ++程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
  /*
   * If I run these code directly in Windows, it crashes, for I believe Windows 
   * do not allow accessing the BIOS directly, that make sense
   * 
   * But I can compile a binary, then I can use the debugger to view what machine code
   * does these correspond to, and build to boot program!
   */
  /*
  __asm
  {
    mov ah, 0x0e …
Run Code Online (Sandbox Code Playgroud)

assembly real-mode bootloader visual-c++ x86-16

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

同时获得两把钥匙 - Assembly 8086

我正在组装游戏,有两个玩家.所以我使用以下代码来获取当前按键:

mov ah, 01h
int 16h
Run Code Online (Sandbox Code Playgroud)

此代码为我提供了按键的扫描码和Ascii码.问题是两个玩家可能同时按下2个不同的键. 我如何同时收到两把钥匙?

我已经尝试了几种方法来实现这一目标.我尝试使用in直接获取输入al,060h.我也尝试过,int 9h但它仍然没有用.

x86 assembly x86-16

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