Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 需要在ASM程序中打印字符串的帮助吗_String_Assembly_Character - Fatal编程技术网

String 需要在ASM程序中打印字符串的帮助吗

String 需要在ASM程序中打印字符串的帮助吗,string,assembly,character,String,Assembly,Character,代码如下: .model tiny ; assemble me this way ; ml /AT /c /Zm /coff /omf <file name> ; link me this way ; link2 /TINY <obj name> COMSEG SEGMENT org 7C00h .code start: MyStr BYTE "HelloWorld", '$' cld ; Clear Direction Flag

代码如下:

 .model tiny

; assemble me this way
; ml /AT /c /Zm /coff /omf <file name>

; link me this way
; link2 /TINY <obj name>

COMSEG SEGMENT
org 7C00h

.code
start:
    MyStr BYTE "HelloWorld", '$'

    cld     ; Clear Direction Flag
    mov si, offset MyStr
whileloop: 
    lodsb                   ;; While Hello[Si] != '$' 
    cmp al, '$'
    jne doproc
    jmp endwhileloop
    doproc: 
        mov ah, 0ah           ;;     Video operation in Ah to write
                             ;;           character in Al to screen.
        mov bh, 0            ;;     Alpha page 0
        mov cx, 1
        int 10h      
        jmp whileloop
endwhileloop:
    jmp $                   

    db 510-($-start) dup (0)   ;Loads of zeroes
    dw 0AA55h  

end start
COMSEG ENDS
.modeltimy
; 这样把我集合起来
; ml/AT/c/Zm/coff/omf
; 把我联系起来
; link2/TINY
COMSEG段
组织7C00h
.代码
开始:
MyStr字节“HelloWorld”,“$”
cld;清除方向标记
mov si,offset MyStr
whileloop:
lodsb;;而Hello[Si]!='$'
cmp al,“$”
jne-doproc
jmp-endwhileloop
多普洛克:
mov-ah,0ah;;视频操作在Ah中编写
;;           在屏幕上显示的字符。
mov-bh,0;;Alpha第0页
mov cx,1
int 10h
jmp whileloop
endwhileloop:
jmp美元
db 510-($-开始)dup(0);零负载
dw 0AA55h
结束-开始
康塞格结束

此代码仅将垃圾打印到cmd提示符。MASM,windows XP,在16位虚拟机下运行。如果有人能帮我把字符正确地打印到屏幕上,那就太好了。

我对此有点生疏——但是,尽管您是在“微型”模式下编程,但您不能确保DS(数据Segmetn寄存器)指向数据实际所在的内存段

如果是这样的话,在进入循环之前强制DS=CS应该可以使上面的代码工作- 只要做:

push CS
pop DS 
在“whileloop:”行之前


我不记得INT 10h调用来检查它们是否正常,我假设您已经在那里设置了正确的参数)。除此之外,您可能对MASM的特定语法有问题,对此我无能为力

我的程序集有点生锈,但您可以使用DOS系统调用打印字符串:

mov dx, offset MyStr
mov ah,9
int 21h

如果你真的想使用BIOS例程,我认为你需要用0eh而不是0ah加载
ah
寄存器。

所以我尝试用0eh加载ah寄存器来使用BIOS例程,但它仍然打印垃圾。是否有任何理由不使用DOS系统调用?我正在编写一个引导加载程序,所以使用DOS系统调用会导致任何问题吗?我认为jsbueno是对的,您还没有初始化DS寄存器。试一下jsbueno的建议,在cld指令之前推cs、pop ds。另外,您将无法从引导加载程序调用DOS,因此BIOS例程是最好的选择。啊哈!你没有说过你在使用裸引导加载程序代码!因此,程序的执行将从您放置数据的地方开始—代码的方式。“MyStr”标签将被放置在地址7c00处——如果这个地址正确(我不记得了),它就是在memmory中复制字节的地方,然后执行将继续到那个位置:0000:7c00(即使在64位机器上,对于16位遗留设备来说也是如此)。将MySTr标签及其数据移动到列表的末尾。如果这不是错误,至少您可以防止由此导致的崩溃。