当前位置: 首页 > 知识库问答 >
问题:

Mov ah,2 and int 1ah-错误的打印时间?

东郭俊楠
2023-03-14

所以,我只是从这个问题中找到了代码。我正在尝试以小时为单位打印当前时间,但输出不是预期的。

这是wroing输出的屏幕截图

预期输出为当前时间:<代码>14 16(秒)

BITS 16
ORG 0x7C00

_start:
    mov ax, 07C0h
    add ax, 288
    mov ss, ax              ; ss = stack space
    mov sp, 4096            ; sp = stack pointer

    mov ax, 07C0h
    mov ds, ax              ; ds = data segment


  call time
  call cvthrs
  call cvtmin
  call cvtsec
  call dsptime

    cli
endloop:
    hlt
    jmp     endloop


time:
;Get time from the system
mov ah,02h
int 1Ah
;ret

;CH - Hours
;CL - Minutes
;DH - Seconds

cvthrs:
;Converts the system time from BCD to ASCII
mov bh,ch ;copy contents of hours (ch) to bh
shr bh, 4
add bh,30h ;add 30h to convert to ascii
mov [tmfld],bh
mov bh,ch
;and bh,0fh
add bh,30h
mov [tmfld + 1],bh
ret

cvtmin:
mov bh,cl ;copy contents of minutes (cl) to bh
shr bh, 4
add bh,30h ;add 30h to convert to ascii
mov [tmfld + 3],bh
mov bh,cl
and bh,0fh
add bh,30h
mov [tmfld + 4],bh
ret

cvtsec:
mov bh,dh ;copy contents of seconds (dh) to bh
shr bh, 4
add bh,30h ;add 30h to convert to ascii
mov [tmfld + 6],bh
mov bh,dh
and bh,0fh
add bh,30h
mov [tmfld + 7],bh
ret

tmfld: db '00:00:00'

dsptime:
;Display the system time
mov ah,13h ;function 13h (Display String)
mov al,0 ;Write mode is zero
mov bh,0 ;Use video page of zero
mov bl,0x0f;Attribute
mov cx,8 ;Character string is 8 long
mov dh,5 ;position on row 5
mov dl,0;and column 0
push ds ;put ds register on stack
pop es ;pop it into es register
lea bp,[tmfld] ;load the offset address of string into BP
int 10H
ret

使用QEMU编译和运行:

nasm time.asm -fbin -o time.img
qemu-system-i386 -drive format=raw,file=./time.img

如何修复此问题?

共有1个答案

司徒焕
2023-03-14

输出不显示当前时间,因为您给BIOS的远指针位于:BP。WriteString函数13h错误
问题在于ORG 0x7C00指令以及如何设置DS段寄存器。

指定原点7C00h时,指示汇编程序考虑代码的第一个字节驻留在偏移地址7C00h处。这意味着0000h的偏移地址,即段开始的位置和DS应该指向的位置,现在在内存中已经大大降低了。应该在DS中加载的唯一正确值是0。

还可以指定ORG 0000h,然后在DS段寄存器中加载的正确值将是07C0h(就像您所做的那样)。

;ret           in time
;and bh,0fh    in cvthrs

为了获得正确的结果,您需要在time和cvthrs子程序中取消注释这些行。

这是一个快速重写,有一些改进:

BITS 16
ORG 0000h

_start:
    mov ax, 07C0h
    mov ds, ax
    add ax, 32
    mov ss, ax              ; ss = 07E0h
    mov sp, 4096            ; sp = stack pointer

    call time

    mov  al, ch           ; hours
    call cvt              ; -> AX
    mov  [tmfld + 0], ax
    mov  al, cl           ; minutes
    call cvt              ; -> AX
    mov  [tmfld + 3], ax
    mov  al, dh           ; seconds
    call cvt              ; -> AX
    mov  [tmfld + 6], ax

    call dsptime

    cli
endloop:
    hlt
    jmp     endloop


time:           ; Get time from the system
mov ah, 02h
int 1Ah         ; BIOS.ReadRealTimeClock
jnc OK
mov cx, 9999h   ; Displays 99:99:99 if clock is malfunctioning
mov dh, 99h
OK:
ret

;CH - Hours
;CL - Minutes
;DH - Seconds

cvt:
mov  ah, al
shr  al, 4
and  ah, 0Fh
add  ax, 3030h
ret

tmfld: db '00:00:00'

dsptime:
;Display the system time
mov  ah, 13h     ;function 13h (Display String)
mov  al, 0       ;Write mode is zero
mov  bh, 0       ;Use video page of zero
mov  bl, 0Fh     ;Attribute
mov  cx, 8       ;Character string is 8 long
mov  dh, 5       ;position on row 5
mov  dl, 0       ;and column 0
push ds          ;put ds register on stack
pop  es          ;pop it into es register
mov  bp, tmfld   ;load the offset address of string into BP
int  10h
ret

times 510-($-$$) db 0
dw 0AA55h

如果您使用mov指令加载tmfld的地址,则会缩短1个字节
您可以通过将对相关字节大小寄存器的加载合并为相应字大小寄存器的1个加载来进一步改进这一点:

e、 g.变更:

mov  dh, 5       ;position on row 5
mov  dl, 0       ;and column 0

进入

mov  dx, 0500h   ; DH=5 (row), DL=0 (column)
 类似资料:
  • 问题内容: 这可能是一个简单的修复程序,但我只是没有看到它。我想弄清楚,如何从主体正确打印我的方法?我需要获取,设置和返回方法吗?另外,在课堂上我的while循环是否甚至必要? 该程序会编译并一直运行到无穷大,因此我猜while循环是错误的。但是它也仅在每行上连续打印。 扩展main的类是不相关的,并且是项目的一部分。抱歉,如果张贴错误,谢谢您的帮助。 整个程序的输出类似于: 树皮,树皮。 喵喵。

  • 我正在Plotly中绘制第一个示例之一: 但我有以下警告: 我认为这可能是安装问题。以下是Jupyter的一些版本 jupyter核心:4.6.3 jupyter笔记本:6.1.5 QT控制台:4.7.5 ipython:7.19.0 ipykernel:5.3.4 jupyter客户端:6.1.6 jupyter实验室:2.1.5 nbconvert:5.6.1 ipywidgets:7.5.1

  • 在这个程序中,我必须打印1到100之间的素数。要遵循的方法是——要找出素数,用存储在数组中的前一个素数除以一个数。如果给定的数字在除以任何前一个素数时留下0作为余数,那么它就不是素数。如果不是,它就是一个素数,并将其添加到数组中。在程序中——我初始化了一个由100个数字组成的数组,并将1到100个数字存储在数组a中(步骤1)。是我将存储素数的数组。我在(步骤2)中存储了的前两个值。在(步骤3)中,

  • 所以我在做一个定时器包装函数,但是我在尝试打印参数的时候不断地得到错误。 我的计时器功能看起来是这样的: 理想的情况下,它也会打印kwargs,但显然这是一个完全不同的问题,尽管我会非常感谢如果有人帮助我做这件事。所以当没有一个论点的时候,我的结果很好: 给出:使用参数1000执行dummy_fn,取:0.2128157615661621 但是,如果我重新定义dummy_fn以获取更多的参数并传递

  • 问题内容: 为什么在Python 3中打印字符串时会收到语法错误? 问题答案: 此错误消息表示你尝试使用Python 3遵循示例或运行使用Python 2t语句的程序: 上面的语句在Python 3中不起作用。在Python 3中,你需要在要打印的值周围添加括号: “ SyntaxError:对’print’的调用中缺少括号”是Python 3.4.2中添加的新错误消息,主要用于帮助试图在运行Py

  • 到目前为止,我已经知道了,我正在尝试在Java使用命令行。当输入不是int时,我想打印一个错误。 第二个if语句是我想要打印一个错误的部分,如果输入不是int,我有一个isInteger方法。但我的程序反而崩溃或打印错误。 编辑:这是我的isInteger方法 所以这里应该没有问题。 编辑2:这里是我得到的错误