所以,我只是从这个问题中找到了代码。我正在尝试以小时为单位打印当前时间,但输出不是预期的。
这是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
如何修复此问题?
输出不显示当前时间,因为您给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:这里是我得到的错误